Мне трудно понять, что именно вы описываете, но после прочтения несколько раз, я думаю, я понимаю.
Прав ли я до сих пор?
Если да, то вам интересно, почему у вашей кнопки есть изображение
Несколько указателей о вашем описании, которые меня скинули и, вероятно,причина, по которой вы до сих пор не видели, чтобы кто-то еще опубликовал ответ на ваш вопрос.
Я заменил элемент UserControl на кнопку
По сути то, что у вас естьdone создан новый элемент управления, который, вероятно, наследуется от Button.Вы могли бы начать с UserControl, но для замены корневого элемента в XAML вам также необходимо убедиться, что ваш тип myimagebutton также наследует от Button.Именно так работает XAML, и изучение того, как объяснить это таким образом, поможет людям понять, что вы делаете.
Обычно наследование от Button - это не то, как разработчики переопределяют визуальный стиль кнопки в WPF, главным образом потому, что WPF неНе поддерживается концепция того, что иногда называют визуальное наследование , а также существуют другие подходящие методы, которые можно использовать для решения проблемы другим способом.Вместо этого наследование в основном зарезервировано для случаев, когда поведенческие изменения или дополнения должны быть внесены в существующий класс управления.Это говорит о том, что есть способы симулировать визуальное наследование посредством использования элементов управления контентом, которые работают аналогично страницам с контентом и главным страницам в ASP.NET, но я думаю, что это немного выходит за рамки вашего примера.Кроме того, если вы хотите следовать модели наследования, вам необходимо убедиться, что в вашем коде вы задаете правильный стиль по умолчанию в статическом конструкторе, поэтому размещение кода для вашей кнопки также поможет.
Я полагаю, что причина, по которой ваш пример не работает, заключается в том, что панель инструментов специально рассматривает типы элементов управления независимо от наследования, чтобы применить свои собственные стили панели инструментов.В вашем случае ваш элемент управления имеет тип myimagebutton, а не Button, поэтому стиль не устанавливается с помощью панели инструментов, которая обычно напрямую устанавливает свойство Style на основе типа элемента управления, используя два возможных типа вызовов.
element.SetResourceReference(FrameworkElement.StyleProperty, styleKey);
element.DefaultStyleKey = styleKey;
Кстати, в вашем случае, я считаю, что только вторая строка выполняется элементом управления ToolBar, и 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, в котором также объясняется аналогичное поведение при добавлении кнопок StackPanel на панель инструментов.