從你處理這個問題的方式,感覺就像你從任何一個WinForms或其他GUI庫背景的。
關於WPF的許多偉大事情之一是,你可以用聲明式方法解決這些問題,方法是定義Button(或任何其他控件)的樣式,以實現視覺效果,而無需編寫任何實際碼!看看下面的按鈕聲明:
<Button Content="Test">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
這定義了我們一個按鈕,並覆蓋默認的按鈕樣式的背景設置爲綠色,並定義一個觸發器,將背景設置爲紅色時IsMouseOver是真實的。 IsMouseOver是一個DependencyProperty,因此觸發器可以在值發生更改時訂閱通知,這就是整個事情的工作方式。
與此代碼的障礙是它實際上不會工作!原因是標準的Button有一些更復雜的規則,使它看起來像一個真正的Windows按鈕。這可以適用於大多數其他控件或屬性,但不適用於按鈕背景。爲了解決這個問題,我們必須重寫Button的ControlTemplate並強制它呈現一個邊框,它是我們的Background屬性的顏色。這是一個有點太多進入這裏,但這個問題解決了這一問題: How do you change Background for a Button MouseOver in WPF?
爲您的最終代碼:
<Button Content="Test">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
這種造型是什麼WPF是專門做。它使您可以爲完全基於標記的應用程序構建相當複雜和花哨/交互式的皮膚。您可以將它們存儲在主題文件中,並使用它們覆蓋應用程序的整個外觀。它非常強大,是一種將UI外觀與實際功能代碼分開的好方法。