2014-02-07 87 views
2

我試圖找出在運行時更改邊框視覺畫筆的方法,並將視覺設置爲Mahapps.Metro圖標。通過代碼訪問Mahapps.Metro圖標

這裏的邊框看起來像在XAML:

<Border Height="24" Width="24" Margin="12,2,0,12" Background="#585858"> 
         <Border.OpacityMask> 
          <VisualBrush Visual="{StaticResource appbar_star}" Stretch="Fill" /> 
         </Border.OpacityMask> 
</Border> 

由於默認情況下我有視覺是「靜態資源appbar_star」 ,但我會怎麼做

Border.Opacitymask = VisualBrush() { Visual = (Visual)ICONNAME }; 

我沒有想法如何在運行時訪問圖標。有任何想法嗎?

+0

你爲什麼要操縱UI通程序代碼開始? –

+0

@HighCore還不熟悉WPF。但我打算根據對象的價值來製作轉換器。 – Tokfrans

+0

這個邊框在ListviewItemtempate裏面。 – Tokfrans

回答

0

要訪問的資源,你可以使用:

var resource = System.Windows.Application.Current.FindResource(key); 

你可以向前走一步,並創建一個轉換器,將資源鍵映射到資源,實現XAML這樣的:

<VisualBrush Visual="{Binding IconKey,Converter={local:KeyToResourceConverter}}" /> 

可以創建這樣的轉換器:

public class KeyToResourceConverter : MarkupExtension, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return System.Windows.Application.Current.FindResource(value as string); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

我個人不喜歡這樣的解決方案是視圖中的ViewModel通過視圖相關鍵(例如,要更改視覺樣式,您將不得不更改ViewModel。

如果你可以讓模式一類,那麼它是可以使用的DataTemplates,考慮下一步設置:

視圖模型:

interface IMode { } 

class FirstMode:IMode { } 

class SecondMode : IMode { } 

class ThirdMode : IMode { } 

class ViewModel 
{ 
    public IMode Mode { get; private set; } 
} 

查看:

<DataTemplate DataType="{x:Type local:FirstMode}"> 
    <Border> 
     <Border.OpacityMask> 
      <VisualBrush Visual="{StaticResource appbar_star}" Stretch="Fill" /> 
     </Border.OpacityMask> 
    </Border> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:SecondMode}"> 
    <Border> 
     <Border.OpacityMask> 
      <VisualBrush Visual="{StaticResource appbar_control_stop}" Stretch="Fill" /> 
     </Border.OpacityMask> 
    </Border> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:ThirdMode}"> 
    <Border> 
     <Border.OpacityMask> 
      <VisualBrush Visual="{StaticResource appbar_control_pause}" Stretch="Fill" /> 
     </Border.OpacityMask> 
    </Border> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:ViewModel}"> 
    <ContentControl Content="{Binding Mode}"/> 
</DataTemplate>