[英]WPF - How to make Window opacity to white
我要使窗口具有效果,可以將具有許多元素的整個窗口均勻地更改為白色,如圖中的窗口所示:
我使用類似的代碼
public MainWindow()
{
this.Opacity = 0.5;
}
但變成黑色
即使窗口中有很多元素並且不將窗口樣式設置為空,如何使整個顏色均勻地變為白色?(因為設置窗口AllowTransparent似乎必須同時將樣式設置為無)
我希望可以使用代碼來做到這一點,因為我想動態地做到這一點。
(或者可能使用UserControl而不使用Window來達到此效果?也許UserControl與Window一起使用並將UserControl設置為Transparent可以做到這一點。
----嘗試后,我發現UserControl沒有屬性AllowTransparent,因此使用這種方法似乎是不可能的)
如果只需要淡化工作區,則可以放置疊加層-對窗口上所有內容進行一些空的半透明控件。
基本上,您有兩種選擇:
在“窗口”上使用白色Background
色,並更改窗口子項的“ Opacity
”,因此白色開始發光
<Window Background="White">
<Grid Opacity="{Binding WhiteOutVisibility}" Background="WhiteSmoke">
<YourContent/>
</Grid>
</Window>
使用具有Alpha或Opacity的白色覆蓋控件,使實際內容發光
<Grid>
<YourContent/>
<Border Background="#80ffffff" Visibility="{Binding WhiteOutVisibility}"/>
</Grid>
我認為,如果要阻止用戶與窗口內容進行交互,則應使用白色疊加層;如果要繼續與用戶交互,則應使用白色背景。
您可以通過在窗口上方放置畫布並將背景設置為白色和不透明度值來實現此效果。 像這樣的一些xaml將起作用。 只需更改UserControl for Window。
<UserControl x:Class="View.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="40" d:DesignWidth="100">
<Grid>
<TextBox Text="Hello there" />
<!-- this will show faintly -->
<Canvas Background="White" Opacity="0.8"></Canvas>
</Grid>
</UserControl>
這個xaml看起來像這樣:
窗口類型具有屬性AllowsTransparency
。 您可以在MSVisualStudio的窗口屬性中找到它屬性。 這樣可以解決您的問題。
感謝Phillip Ngan和grek40的回答,
具有背景白色和不透明度的Grid和Canvas均可工作,我編寫了一些可以顯示效果的測試代碼
Xaml部分
<Window x:Class="WPFAbitraryTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" Background="Blue" Foreground="White" FontSize="20" Click="SwitchOpacity_OnClick">Clcik to SwitchOpacity</Button>
<Button Grid.Row="1" Background="ForestGreen">hi2</Button>
<ListBox Grid.Row="2" Background="Orange">
<ListBoxItem>ListBox Item #1</ListBoxItem>
<ListBoxItem>ListBox Item #2</ListBoxItem>
<ListBoxItem>ListBox Item #3</ListBoxItem>
</ListBox>
<!-- <Grid Grid.Row="1" Grid.RowSpan="2" Opacity="0.9" Background="WhiteSmoke"/> -->
<Canvas Name="WhiteMaskCanvas" Grid.Row="1" Grid.RowSpan="2" Background="White" Opacity="0.5"></Canvas>
</Grid>
</Window>
。
類部分
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void SwitchOpacity_OnClick(object sender, RoutedEventArgs e)
{
int opacityVal = 0;
Task.Factory.StartNew(() =>
{
for (int i = 0; i <= 1000; i++)
{
int j = 0;
Thread.Sleep(100);
//Use ++ % to change Opacity
this.Dispatcher.Invoke(
DispatcherPriority.SystemIdle,
new Action(() =>
{
WhiteMaskCanvas.Opacity = ++opacityVal % 10 / 10.0;
}));
////Use Abs Cosine to Change Opacity
//this.Dispatcher.Invoke(
// DispatcherPriority.SystemIdle,
// new Action(() =>
// {
// WhiteMaskCanvas.Opacity =
// Math.Abs(Math.Sin(++opacityVal*0.1)) ;
// }));
}
});
}
}
。
結果:
。
進一步的代碼,
如果要使畫布蒙版成為整個窗口,可以將畫布更改為
<Canvas Name="WhiteMaskCanvas" Grid.Row="0" Grid.RowSpan="3" Background="White" Opacity="0.5"></Canvas>
並將代碼添加到類:
public MainWindow()
{
InitializeComponent();
WhiteMaskCanvas.Visibility = Visibility.Collapsed;
}
private void SwitchOpacity_OnClick(object sender, RoutedEventArgs e)
{
WhiteMaskCanvas.Visibility = Visibility.Visible;
int opacityVal = 0;
Task.Factory.StartNew(() =>
{
//below same as code above
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.