1

我有一个包含 a 的 UserControl,Button然后这个 Button 包含一个Image和一个TextBlock。这使我有一个图像按钮。我还希望按钮具有无边框样式,这是通过将按钮设置BorderBrush为 null 来实现的。这部分一切正常。

我遇到的问题是当我想“禁用”用户控件时。我可以通过将IsEnabled属性设置为 来做到这一点false,它级联到按钮并适当地防止按钮被单击。但是,当按钮被禁用时,它会显示一个我不想要的边框。

问题:当按钮被禁用时,我怎样才能摆脱按钮的边框?

我尝试了几种不同的方法,例如从代码中设置边框:

MyButton.BorderBrush = Brushes.Transparent;

并在 XAML 中使用样式:

<Button.Style>
    <Style TargetType="Button">
        <Setter Property="BorderBrush" Value="{x:Null}"/>
    </Style>
</Button.Style>

和其他一些事情只是为了尝试让某些东西发挥作用,但到目前为止没有任何改变。

注意:我已经尝试过使用该Opacity属性的上述两种解决方案,并且在这方面都可以正常工作,但是当我尝试更改边框时却没有

4

2 回答 2

2

不幸的是,StyleButton它被禁用时应用于默认的ControlTemplate. 这意味着如果你想改变它,你需要ControlTemplate为你的Button. ControlTemplate您可以在 MSDN 上的按钮样式和模板页面中找到默认设置。

提供新的ControlTemplate时,有时会遗漏原始模板中的部分内容,因此一个很好的起点是实现ControlTemplate该页面上的默认值,然后根据自己的喜好对其进行“调整”。

于 2013-10-31T16:53:26.610 回答
1

由于您已经有一个模板,您Button需要插入Trigger一个Property="IsEnabled" Value="False"

ControlTemplatea的样本Button

<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" TextBlock.Foreground="{StaticResource Button.Static.Foreground}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>

</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background"           TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush"          TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
<Setter Property="TextBlock.Foreground" TargetName="border" Value="{StaticResource Button.MouseOver.Foreground}" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background"           TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush"          TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
<Setter Property="TextBlock.Foreground" TargetName="border" Value="{StaticResource Button.Pressed.Foreground}" />
</Trigger>

//Here's the code where you want to change the border
//Change the Value part to whatever you want.

<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background"             TargetName="border"           Value="{StaticResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush"            TargetName="border"           Value="{StaticResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

对缩进感到抱歉,但我相信你会实现你想要的!

于 2013-10-31T18:10:33.877 回答