我在理解你所描述的內容時有些困難,但在閱讀了幾遍之後,我想我明白了。
我到目前爲止是否正確?
如果是的話,你想知道爲什麼你的按鈕具有圖像
關於你的描述是扔我和可能是爲什麼你還沒有見過任何人發帖回答你的問題的原因有幾點建議迄今。
我更換了用戶控件項目的一個按鈕
基本上你做了什麼是創造了新的控制是有可能從按鈕繼承。您可能已經開始使用UserControl,但爲了替換XAML中的根項目,您還必須確保類型myimagebutton繼承自Button。這就是XAML的工作原理,學習如何以這種方式解釋它可以幫助人們理解你在做什麼。
通常從Button繼承並不是開發人員重寫WPF中按鈕的視覺樣式主要是因爲WPF不支持有時稱爲visual inheritance的概念,還有其他合適的方法可用於以不同的方式解決問題。相反,繼承主要用於在需要對現有控件類進行行爲修改或添加時。據說有些方法通過使用類似於ASP.NET中的內容頁面和母版頁的內容控件來模擬可視化繼承,但我認爲這有點超出了示例的範圍。同樣,如果你要追求繼承模型,你需要確保在你的代碼中,你在靜態構造函數中設置了正確的默認樣式,所以將代碼放在你的按鈕後面也會有幫助。
我相信你的例子不工作的原因是因爲ToolBar專門查看控件的類型而不考慮繼承以便應用它的自定義工具欄樣式。在你的情況下,你的控件的類型是myimagebutton,而不是Button,所以樣式不是由ToolBar設置的,它通常根據使用兩種潛在類型的調用的控件的類型直接設置Style屬性。
element.SetResourceReference(FrameworkElement.StyleProperty, styleKey);
element.DefaultStyleKey = styleKey;
順便說一句,你的情況我相信,只有第二行是由工具欄控制和styleKey在這一點上進行定義爲空。
現在,您不必先從Button繼承,而是爲您的按鈕創建新的ControlTemplate或DataTemplate,並分別通過使用樣式分配到Template或ContentTemplate屬性中。這樣你仍然總是處理一個按鈕,風格是改變視覺屬性的東西。
<Window x:Class="HeaderedContentControlTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="252"
Width="372">
<Window.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="Background"
Value="Orange" />
</Style>
<DataTemplate x:Key="ImageButtonDataTemplate">
<Grid x:Name="grdButton">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
HorizontalAlignment="Left"
VerticalAlignment="Center">
</Image>
<TextBlock Grid.Column="1"
TextWrapping="Wrap"
Text="{Binding}"
VerticalAlignment="Center"
Margin="2 0 2 0"
Background="Pink" />
</Grid>
</DataTemplate>
<Style x:Key="ImageButtonStyle"
TargetType="{x:Type Button}">
<Setter Property="ContentTemplate"
Value="{StaticResource ImageButtonDataTemplate}" />
</Style>
</Window.Resources>
<Grid Margin="11">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ToolBar>
<Button Style="{StaticResource ImageButtonStyle}"
Content="Some Text" />
</ToolBar>
<Button Grid.Row="1"
Style="{StaticResource ImageButtonStyle}"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Content="Some Text" />
</Grid>
</Window>
使用的ContentTemplate允許您重新定義按鈕內的內容不會丟失所有的特殊按鈕狀態轉換和其他細微你通常想保留的。
請參閱MSDN論壇上的this related post論壇也解釋了將一個包含按鈕的StackPanel添加到ToolBar時的類似行爲。