когда я хочу использовать кнопку с IconPack.
<Button Content = "WindowMinimize" Style = "{StaticResource WindowsControlButton}" />
как это. и изменить стиль с помощью шаблона управления
<Style TargetType = "{x:Type Button}" x:Key = "WindowsControlButton" BasedOn = "{StaticResource BaseStyle}">
<Setter Property = "WindowChrome.IsHitTestVisibleInChrome" Value = "True"/>
<Setter Property = "Background" Value = "Transparent"/>
<Setter Property = "Padding" Value = "8"/>
<Setter Property = "Width" Value = "45"/>
<Setter Property = "VerticalAlignment" Value = "Stretch"/>
<Setter Property = "Foreground" Value = "{StaticResource ForegroundMainBrush}"/>
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "{x:Type Button}">
<Border Padding = "{TemplateBinding Padding}" Background = "{TemplateBinding Background}">
<materialDesign:PackIcon Kind = "{TemplateBinding Content}"/> // here !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter Property = "Background" Value = "{StaticResource BackgroundLightBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
Я пробовал это. но <materialDesign:PackIcon Kind = "{TemplateBinding Content}"/> не работает, как я ожидал.
как мне это сделать? пожалуйста, помогите мне.
Я хочу изменить вид в ControlTemplate, используя содержимое кнопки. _
какую ошибку показывает?
Спасибо Maciek Ś. Исправил с помощью вашего решения.





Проблема здесь в небольшом различии типов между PackIcon.Kind и Button.Content. Первый - это перечисление, а второй - универсальный объект.
В XAML, когда вы вводите <materialDesign:PackIcon Kind = "WindowMinimize"/>, он может определить, что строку «WindowMinimize» необходимо преобразовать в целевой тип PackIconKind из-за свойства, к которому она применяется. Этот процесс преобразования строк в соответствующий целевой тип обрабатывается преобразователи типов.
В WPF Button является производным от ContentControl, поэтому свойство Content является просто общим object. Поэтому, когда вы устанавливаете <materialDesign:PackIcon Kind = "{TemplateBinding Content}"/>, он не может определить преобразование, потому что Content может быть чем угодно. Он не знает, как преобразовать универсальный объект в перечисление. Таким образом, даже несмотря на то, что в свойстве Content есть строка, оно никогда не пытается ничего, кроме простого приведения к целевому типу перечисления, а универсальная строка не приводит к перечислению.
Есть пара вариантов.
Content (тип должен быть MaterialDesignThemes.Wpf.PackIconKind). Это работает, потому что он попытается привести значение свойства Content к целевому типу PackIconKind.<Button Content = "{x:Static materialDesign:PackIconKind.WindowMinimize}" ... />
TemplateBinding на привязку относительного источника, например:<materialDesign:PackIcon Kind = "{Binding Content, RelativeSource = {RelativeSource TemplatedParent}, Converter = {StaticResource YourConverter}}"/>
Боюсь, это по-твоему не выполнимо. Вы можете добиться этого, например. путем расширения кнопки с помощью свойства Kind (типа MahApps.Metro.IconPacks.PackIcon * Kind) и привязки к нему в шаблоне.