【问题标题】:Blur The Background Of A Custom Control模糊自定义控件的背景
【发布时间】:2021-06-02 10:08:05
【问题描述】:

标题可能不清楚,但我现在解释一下。我有一个表示模态的自定义控件(受 SingltonSean 启发),当我触发一个命令时,它会显示这个模态,它覆盖了它后面的其余元素,它有点像一个弹出窗口。现在我希望它背后的一切都变得模糊。我怎样才能做到这一点?

这是我的模态自定义控件:

<Style TargetType="{x:Type viewModel:Modal}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type viewModel:Modal}">
                <ControlTemplate.Resources>
                    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
                </ControlTemplate.Resources>
                <Grid Visibility="{TemplateBinding IsOpen, Converter={StaticResource BooleanToVisibilityConverter}}">
                    <Grid.Background>
                        <SolidColorBrush Color="Black" Opacity="0.025" />
                    </Grid.Background>
                    <Border HorizontalAlignment="Center" VerticalAlignment="Center" UseLayoutRounding="True"  BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
                            <Grid.OpacityMask>
                                <VisualBrush Visual="{Binding ElementName=border}" />
                            </Grid.OpacityMask>
                            <Border x:Name="border" Background="White" CornerRadius="20" />
                            <Grid Width="500" Height="600">
                                <StackPanel Width="300" HorizontalAlignment="Center" VerticalAlignment="Center">
                                    <Button Padding="10 5" Content="Close Modal" />
                                </StackPanel>
                            </Grid>
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

  • 这能回答你的问题吗? Blur the background of the WPF container
  • 它没有,因为我没有使用图像作为背景。 @Sinatr
  • 您是否阅读了所有答案? This 应该这样做:后面的容器应该是模糊的。
  • 对不起,它也不起作用。您是否在我的代码上尝试过该解决方案?
  • 不,但我自己使用模糊效果,类似于那个答案。什么不工作?您尝试了什么、发生了什么以及您想要什么?

标签: c# asp.net wpf


【解决方案1】:

您需要在内容所在的位置应用模糊:

<Grid>
    <Grid>
        <Grid.Effect>
            <BlurEffect Radius="20"/>
        </Grid.Effect>
        <TextBlock Text="Some content I want to blur"/>
    </Grid>
    <TextBlock Text="Popup"/>
</Grid>

如果你想制作一个能够在视觉树中模糊之前的东西的控件,你仍然需要对其应用效果。一种可能性是使用附加行为:

public static class Behavior
{
    public static UIElement GetBlurTarget(DependencyObject obj) => (UIElement)obj.GetValue(BlurTargetProperty);
    public static void SetBlurTarget(DependencyObject obj, UIElement value) => obj.SetValue(BlurTargetProperty, value);

    public static readonly DependencyProperty BlurTargetProperty =
        DependencyProperty.RegisterAttached("BlurTarget", typeof(UIElement), typeof(Behavior), new PropertyMetadata((d, e) =>
        {
            if (e.NewValue is UIElement element)
                element.Effect = new BlurEffect { Radius = 20 };
        }));
}

那么布局应该是这样的:

<Grid>
    <Grid x:Name="container">
        <TextBlock Text="Some content I want to blur" />
    </Grid>
    <TextBlock Text="Popup" local:Behavior.BlurTarget="{Binding ElementName=container}"/>
</Grid>

两种情况都会产生相同的结果:

【讨论】:

  • 完美运行。
  • 我有一个问题,我的模态有一个名为 IsOpen 的布尔依赖属性,当我的 IsOpen 为真时,我如何才能只模糊 BlurTarget UIElement?
  • 嘿,你看到我最后的评论了吗?
  • 您可以创建另一个行为来移除效果,然后根据IsOpen 的值使用数据触发器来设置或移除模糊(不要忘记use parenthesis)。
  • 你能举个例子吗?我在挣扎,它对我不起作用。我已将 BlurTarget 声明为依赖项属性,并在我的控件模板中添加了一个执行此操作的数据触发器:
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多