是否可以更改WPF中禁用按钮的背景颜色?

时间:2009-05-08 15:41:09

标签: c# wpf xaml

我试图获得“调暗整个窗口及其上的所有控件”的效果。

窗口及其上的所有内容也需要禁用。

问题是当按钮被禁用时,它似乎不允许您更改背景颜色。

WPF中是否有办法更改按钮的背景颜色,即使它被禁用了?

XAML:

<Window x:Class="TestDimWindows.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <Grid x:Name="dimElement">
        <StackPanel HorizontalAlignment="Left">
            <TextBlock 
                Text="This is an example of dimming a window." 
                Margin="5"/>
            <StackPanel 
                HorizontalAlignment="Left" 
                Margin="5">
                <Button x:Name="theButton" 
                        Content="Dim the window" 
                        Click="Button_Click"/>
            </StackPanel>
        </StackPanel>
    </Grid>

</Window>

代码背后:

using System.Windows;
using System.Windows.Media;

namespace TestDimWindows
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            dimElement.Background = new SolidColorBrush(Colors.Gray);
            dimElement.Opacity = 0.5;
            dimElement.IsEnabled = false;

            //I want this button to look "dimmed out" as well
            //but since it is disabled, it is a ghostly white.
            //how can I change the color even though it is disabled?
            theButton.Background = new SolidColorBrush(Colors.Gray);
        }
    }
}

4 个答案:

答案 0 :(得分:2)

您可以删除onclick,然后更改颜色,并使其成为“禁用”状态。

答案 1 :(得分:1)

您可以为它创建自己的控件模板。

我建议使用Blend(如果您没有许可证,可以获得试用版)来创建您当前使用的模板的副本。

如果检查当前模板,则必须在某处设置禁用的背景颜色。根据IsEnabled属性查找触发器。

答案 2 :(得分:0)

查看VisualBrush。您可以将VisualBrush的可视化设置为控件,VisualBrush将重新创建控件的可视表示,而不具有任何实际功能。

我从Sells / Griffiths的“Programming WPF”(第13章关于图形)中获取了这个例子并自己修改了一下,然后再为你演示一个解决方案。

这样做是创建一个简单的绘图界面(输入2点的x和y坐标以画线之间),但也反映了下面的图像。它根本不具备强大功能,但它应该展示我认为你正在寻找的功能 使用VisualBrush和SolidColorBrush的最后两个矩形元素是我如何创建复制控件然后将其遮蔽。

你可以做的是将这两个元素叠加在你想要遮挡的页面/窗口/等上,然后在你想要发生效果时让它们可见。

希望这会有所帮助。

<Window x:Class="GraphicsTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="1*"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid x:Name="mainUI">
        <DockPanel>
            <GroupBox Header="Point 1" Name="gbPoint1" DockPanel.Dock="Top">
                <StackPanel Orientation="Horizontal">
                    <Label Width="40" HorizontalContentAlignment="Right">X:</Label>
                    <TextBox Name="tbX1" Width="40" TextChanged="Content_TextChanged"/>
                    <Label Width="40" HorizontalContentAlignment="Right">Y:</Label>
                    <TextBox Name="tbY1" Width="40" TextChanged="Content_TextChanged"/>
                </StackPanel>
            </GroupBox>
            <GroupBox Header="Point 2" Name="gbPoint2"  DockPanel.Dock="Top">
                <StackPanel Orientation="Horizontal">
                    <Label Width="40" HorizontalContentAlignment="Right">X:</Label>
                    <TextBox Name="tbX2" Width="40" TextChanged="Content_TextChanged"/>
                    <Label Width="40" HorizontalContentAlignment="Right">Y:</Label>
                    <TextBox Name="tbY2" Width="40" TextChanged="Content_TextChanged"/>
                </StackPanel>
            </GroupBox>
            <Canvas>
                <Line Name="lnDraw" Stroke="Black" StrokeThickness="2"/>
            </Canvas>
        </DockPanel>
    </Grid>
    <Rectangle Grid.Row="1">
        <Rectangle.LayoutTransform>
            <ScaleTransform ScaleY="-1"/>
        </Rectangle.LayoutTransform>
        <Rectangle.Fill>
            <VisualBrush Visual="{Binding ElementName=mainUI}" />
        </Rectangle.Fill>
    </Rectangle>
    <Rectangle Grid.Row="1">
        <Rectangle.Fill>
            <SolidColorBrush Color="Black" Opacity=".5"/>
        </Rectangle.Fill>
    </Rectangle>
</Grid>

和.cs

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void Content_TextChanged(object sender, TextChangedEventArgs e)
    {
        int x1;
        int x2;
        int y1;
        int y2;

        if (int.TryParse(tbX1.Text, out x1) && int.TryParse(tbX2.Text, out x2) && int.TryParse(tbY1.Text, out y1) && int.TryParse(tbY2.Text, out y2))
        {
            lnDraw.X1 = x1;
            lnDraw.X2 = x2;
            lnDraw.Y1 = y1;
            lnDraw.Y2 = y2;
        }
    }
}

答案 3 :(得分:0)

我会尝试使用填充整个网格的矩形,灰色,不透明度小于1且z指数高于普通控件的暗淡效果。默认情况下,矩形将具有visibility = collapsed,然后当某些适当的“IsEnabled”属性变为“true”时,我将使用触发器将其可见性设置为可见。