我试图获得“调暗整个窗口及其上的所有控件”的效果。
窗口及其上的所有内容也需要禁用。
问题是当按钮被禁用时,它似乎不允许您更改背景颜色。
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);
}
}
}
答案 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”时,我将使用触发器将其可见性设置为可见。