2012-10-23 32 views
1

建議:代碼工作正常,這個問題是關於這樣做的最佳實踐。通過代碼隱藏來改變填充WPF矩形的最佳方法

在我的項目中,矩形的填充是一個表示視頻狀態的畫布,例如,如果用戶點擊播放,畫布需要更改爲類似playing,視頻結束,畫布需要更改爲stopped之類的內容。我擁有代表這種狀態的所有畫布在一個資源字典中。

我的要求是:我有很多資源的ResourceDictionary,資源看起來像這樣

<Canvas Width="48" Height="48" Clip="F1 M 0,0L 48,0L 48,48L 0,48L 0,0" x:Key="appbar_add"> 
    <Path Width="24" Height="24" Canvas.Left="12" Canvas.Top="12" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 22,12L 26,12L 26,22L 36,22L 36,26L 26,26L 26,36L 22,36L 22,26L 12,26L 12,22L 22,22L 22,12 Z " /> 
</Canvas> 
<Canvas Width="48" Height="48" Clip="F1 M 0,0L 48,0L 48,48L 0,48L 0,0" x:Key="appbar_alert"> 
    <Path Width="22.1402" Height="20.75" Canvas.Left="12.9299" Canvas.Top="14" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 24,14C 26,14 36,33 35,34C 34,35 14,35 13,34C 12,33 22,14 24,14 Z M 24,29C 23.1716,29 22.5,29.6716 22.5,30.5C 22.5,31.3284 23.1716,32 24,32C 24.8284,32 25.5,31.3284 25.5,30.5C 25.5,29.6716 24.8284,29 24,29 Z M 22.5,20L 23,28L 25,28L 25.5,20L 22.5,20 Z " /> 
</Canvas> 
<Canvas Width="48.0067" Height="48.0067" Clip="F1 M 0,0L 48.0067,0L 48.0067,48.0067L 0,48.0067L 0,0" x:Key="appbar_alien"> 
    <Path Width="22.005" Height="16.0048" Canvas.Left="12.9999" Canvas.Top="16.9998" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 16.9999,16.9998L 19.0002,16.9998L 19.0026,19.0027L 21.0002,18.9998L 21.0029,21.0029L 27.0038,21.0029L 26.9999,18.9998L 28.9999,18.9998L 28.9999,16.9998L 31.0002,16.9998L 31.0002,19.0001L 29.0002,19.0001L 29.0041,21.0029L 31.0043,21.0029L 31.0043,23.0032L 33.0046,23.0032L 33.0046,25.0035L 31.0043,25.0035L 31.0001,31.0001L 29.0001,31.0001L 29.0001,33.0001L 25.0035,33.0046L 25.0035,31.0043L 28.9999,30.9999L 29.004,28.0039L 19.0026,28.0039L 19.0026,31.0043L 17.0024,31.0043L 16.9999,25.0001L 15.0002,25.0001L 15.0002,29.0001L 12.9999,29.0001L 12.9999,24.9998L 14.9999,24.9998L 14.9999,22.9998L 16.9999,22.9998L 17.0024,21.0029L 19.0026,21.0029L 18.9999,19.0001L 16.9999,19.0001L 16.9999,16.9998 Z M 33.0046,25.0035L 35.0049,25.0035L 35.0049,29.0041L 33.0046,29.0041L 33.0046,25.0035 Z M 19.0026,31.0043L 23.0032,31.0043L 23.0032,33.0046L 19.0026,33.0046L 19.0026,31.0043 Z M 19.0026,23.0032L 19.0026,25.0035L 21.0029,25.0035L 21.0029,23.0032L 19.0026,23.0032 Z M 27.0038,23.0032L 27.0038,25.0035L 29.004,25.0035L 29.004,23.0032L 27.0038,23.0032 Z " /> 
</Canvas> 
... 

我想開這個資源,按名稱查找一個資源,而這種資源應用到填充的矩形。其實我做了以下內容:

private void ChangeFill() 
    { 
     Collection<ResourceDictionary> appResources = Application.Current.Resources.MergedDictionaries; 

     if (Application.Current.Resources.MergedDictionaries.Count > 1) 
     { 
      ResourceDictionary recIcones = appResources.Where(r => r.Source.OriginalString == "Resources/Icons.xaml").FirstOrDefault(); // get the properly resource dictionary 

      if (recIcones != null) 
      { 
       Canvas x = (Canvas)recIcones["appbar_add"]; // find a espicified resource by name 
       VisualBrush vBrush = new VisualBrush(x); 
       rctParado.Fill = vBrush; // apply it to the rectangle 
      } 
     } 
    } 

這工作得很好,問題是: 這是更好的方式來做到這一點?

回答

2

只需在視覺樹中調用FindResource即可。這將自動搜索資源,根據需要遞增可視樹直到找到它(包括查看您的應用程序級資源)。如果您只想搜索應用程序的資源,請在Application對象上使用FindResource方法。

至於動態分配資源,很可能你可以通過數據綁定更乾淨優雅地完成同樣的事情。也就是說,將Canvas'Style屬性綁定到任何引起樣式更改的內容,並使用轉換器執行資源查找。沒有你的情景的全部細節,很難更具體。

+0

我將測試FindResource方法並向您提供反饋。但我不明白你提到的綁定,你能提供一些示例代碼嗎? – Ewerton

+0

工作正常@Kent Boogaart,我正在做以下工作:var resource = Application.Current.FindResource(「appbar_add」); VisualBrush vb = new VisualBrush((Canvas)abc); rctParado.Fill = vb; – Ewerton

0

如果填充是基於狀態,則建議使用轉換器。

public class BrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     return ChangeFill(); 
    } 


} 

Fill={Binding ., Converter={StaticResource BrushConverter} 

你需要改變你的變化填寫要麼返回刷子或改變周圍的代碼:)

STE。