2013-12-10 120 views
1

我想根據自定義類中的布爾高亮顯示將樣式添加到標籤(自定義類,繼承標籤)。如果布爾值爲false,我希望它刪除樣式,否則添加樣式。這個變量在整個應用程序中都被改變根據布爾值將樣式添加到自定義標籤

(風格:SelectedBackground)

<local:unit xPos="13" yPos="1" Grid.Row="{Binding yPos, RelativeSource={RelativeSource Self}}" Grid.Column="{Binding xPos, RelativeSource={RelativeSource Self}}" /> 

單位:

public class Unit : Label, INotifyPropertyChanged 
    { 
     public Unit() { } //Grass 
     public Unit(int x, int y) 
     { 
      this.xPos = x; 
      this.yPos = y; 
     } 

     public static readonly RoutedEvent ClickEvent; 

     private int _xPos, _yPos; 

     public bool _highlighted = false; 
     public bool highlighted 
     { 
      get { return _highlighted; } 
      set { 
       _highlighted = value; 
       NotifyPropertyChanged("highlighted"); 
      } 
     } 

     public bool mouseLeft 
     { 
      get { return _mouseLeft; } 
      set 
      { 
       _mouseLeft = value; 
      } 
     } 
     public bool mouseRight 
     { 
      get { return _mouseRight; } 
      set 
      { 
       _mouseRight = value; 
      } 
     } 

     public int xPos 
     { 
      get { return _xPos; } 
      set 
      { 
       _xPos = value; 
       NotifyPropertyChanged("xPos"); 
      } 
     } 
     public int yPos 
     { 
      get { return _yPos; } 
      set 
      { 
       _yPos = value; 
       NotifyPropertyChanged("yPos"); 
      } 
     } 

     private string _type = "none"; 
     public string type 
     { 
      get { return _type; } 
      set 
      { 
       _type = value; 
      } 

     } 


     static Unit() 
     { 
      ClickEvent = ButtonBase.ClickEvent.AddOwner(typeof(Unit)); 
     } 



     public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 

       System.Diagnostics.Debug.WriteLine("property changed"); 

       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 


    } 


} 
+0

您可以嘗試使用IValueConverter將bool轉換爲您選擇的樣式。如果您想擁有兩種以上的款式,您也可以使用任何其他類型。我喜歡交換資源字典來改變主題。 – Magus

+0

聽起來很有希望。你能舉個例子嗎?我是新來的! –

+0

你的代碼全錯了。刪除所有。你不能在'DependencyObject'中實現'INotifyPropertyChanged'。請閱讀[MSDN文檔](http://msdn.microsoft.com/en-us/library/ms745025(v = vs.110).aspx)瞭解如何在WPF中創建控件。 –

回答

1

您需要應用樣式與被綁定到屬性標誌的視圖模型數據觸發。

這裏是XAML:

<wpfApp:CustomLabel> 
    <wpfApp:CustomLabel.Style> 
     <Style TargetType="{x:Type wpfApp:CustomLabel}"> 
      <Style.Triggers> 
      <DataTrigger Binding="{Binding ApplyStyleToLabel}" Value="True"> 
       <Setter Property="Foreground" Value="Blue"/> 
       <!-- Specify the remaining property setters here --> 
      </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </wpfApp:CustomLabel.Style> 
</wpfApp:CustomLabel> 

應指定在給定的位置,其餘制定者。從某種意義上說,您希望通過樣式進行的更改僅適用於屬性爲true時的標籤。您也可以使用自己的屬性來綁定數據觸發器。

你不必獲得來自INotifyPropertyChanged的 控件在控件創建一個依賴屬性,這裏將是你的XAML

<wpfApp:CustomLabel> 
      <wpfApp:CustomLabel.Style> 
      <Style TargetType="{x:Type wpfApp:CustomLabel}"> 
       <Style.Triggers> 
         <Trigger Property="ApplyStyle" Value="True"> 
          <Setter Property="Foreground" Value="Blue"/> 
         </Trigger> 
       </Style.Triggers> 
      </Style> 
     </wpfApp:CustomLabel.Style> 
</wpfApp:CustomLabel> 

控制類如下:

public class CustomLabel : Label 
{ 


    public bool ApplyStyle 
    { 
     get { return (bool)GetValue(ApplyStyleProperty); } 
     set { SetValue(ApplyStyleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ApplyStyle. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ApplyStyleProperty = 
     DependencyProperty.Register("ApplyStyle", typeof(bool), typeof(CustomLabel), new PropertyMetadata(false)); 


} 

瞭解更多關於創建依賴項屬性here 這應該給你一個關於在dp創建中指定元數據的想法

希望它有幫助

相關問題