2017-01-16 7 views
0

У меня есть список визуальных кистей, определенных в ресурсе. как показано ниже.Как связать имя ресурса с свойством фона?

<Window.Resources> 
    <VisualBrush x:Key="Img"> 
     <VisualBrush.Visual> 
      <Canvas> 
       <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path3402" Fill="#FFDDE6EE" Data="m 171.33928 338.07648 0 -140.625 234.375 0 234.375 0 0 140.625 0 140.625 -234.375 0 -234.375 0 0 -140.625 z"/>      
      </Canvas> 
     </VisualBrush.Visual> 
    </VisualBrush> 

    <VisualBrush x:Key="Img1"> 
     <VisualBrush.Visual> 
      <Canvas>     
       <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path3396" Fill="#FF6798C8" Data="m 171.33928 338.07648 0 -140.625 234.375 0 234.375 0 0 140.625 0 140.625 -234.375 0 -234.375 0 0 -140.625 z m 75 130.21087 c 0 -0.61571 0.87726 -0.81896 z"/>      
      </Canvas> 
     </VisualBrush.Visual> 
    </VisualBrush> 
</Window.Resources> 

Ресурс Значение ключа будет получено из списка viewmodel. Теперь я хочу достичь ниже.

<Border Background="{StaticResource Binding{ResourceName}}"/> 

Как я могу достичь выше?

+0

Это не поддерживается с использованием StaticResource или DynamicResource. Вы можете реализовать собственное собственное расширение разметки: http://www.c-sharpcorner.com/uploadfile/mamta_m/creating-a-custom-markup-extension-in-wpf/. Или используйте конвертер. – mm8

+0

Как конвертер может быть полезен здесь. Не могли бы вы объяснить. – Rudra

+0

См. Мой ответ. – mm8

ответ

1

Это не поддерживается с помощью StaticResource ни DynamicResource, но вы можете использовать многофункциональный конвертер:

public class ResourceConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values != null && values.Length == 2) 
     { 
      string resourceKey = values[0].ToString(); 
      Window window = values[1] as Window; 
      if (!string.IsNullOrEmpty(resourceKey) && window != null) 
       return window.Resources[resourceKey] as System.Windows.Media.Brush; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Использование:

<Window.Resources> 
    <VisualBrush x:Key="Img1">...</VisualBrush> 
    <VisualBrush x:Key="Img2">...</VisualBrush> 
    <local:ResourceConverter x:Key="ResourceConverter" /> 
</Window.Resources> 
... 
<Border> 
    <Border.Background> 
     <MultiBinding Converter="{StaticResource ResourceConverter}"> 
      <Binding Path="ResourceName" /> 
      <Binding Path="." RelativeSource="{RelativeSource AncestorType=Window}" /> 
     </MultiBinding> 
    </Border.Background> 
    <TextBlock>...</TextBlock> 
</Border> 

public string ResourceName { get; } = "Img1"; 

Другой вариант должен был бы написать свой собственный заказной разметки: http://www.c-sharpcorner.com/uploadfile/mamta_m/creating-a-custom-markup-extension-in-wpf/

+0

Спасибо за подробное объяснение. Это решит мою проблему. – Rudra