WPF - 如何使窗口不透明度变为白色

时间:2015-12-22 01:21:14

标签: c# wpf

我想让窗口有效果可以将整个窗口有很多元素均匀地变成白色,如图中的窗口所示:

the behind window change to white

我使用像

这样的代码
    public MainWindow()
    {
        this.Opacity = 0.5;
    }

但它变为黑色

enter image description here

如果在窗口中有很多元素并且没有将窗口样式设置为无,那么如何使整个均匀变为白色(因为设置Window AllowTransparent似乎必须将Style设置为none同时)

我希望可以使用代码来完成它,因为我想动态地执行它。

(或者可能它使用UserControl而不是Window来实现这种效果?也许UserControl与Window一起使用并将UserControl设置为Transparent可以做到

----在我尝试之后,我发现UserControl没有属性AllowTransparent,所以看起来似乎不可能使用这种方式)

5 个答案:

答案 0 :(得分:1)

如果你只需淡化客户区,你可以放置叠加 - 对窗口上的所有内容进行一些空的半透明控制。

答案 1 :(得分:1)

基本上,您有两种选择:

在Window上使用白色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>

在我看来,如果你想要阻止用户与窗口内容和白色背景的互动,你应该使用白色叠加,如果你想继续用户交互。

答案 2 :(得分:1)

您可以通过在窗口上放置画布,并将背景设置为白色和不透明度值来实现此效果。像这样的一些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看起来像这样:

enter image description here

答案 3 :(得分:0)

窗口类型具有属性AllowsTransparency。您可以在MSVisualStudio的窗口属性中找到它。这可以解决您的问题。

答案 4 :(得分:0)

感谢Phillip Ngan和grek40 s&#39;回答,

网格画布,背景白色和不透明效果正常, 我写了一些可以显示效果的测试代码

Xaml Part

<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)) ;
                    //    }));

                }
            });

        }

    }

结果:

enter image description here

进一步的代码,

如果想要将画布蒙版整个窗口,可以将画布更改为

<Canvas Name="WhiteMaskCanvas"  Grid.Row="0" Grid.RowSpan="3" Background="White" Opacity="0.5"></Canvas>

并将代码添加到class:

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