WPF全局窗口错误提示框

本文介绍了如何在WPF应用中实现一个全局的、中央提示错误信息的窗口模板,以提供更好的用户体验。通过创建资源字典VcreditWindowWithAlert.xaml定义了一个可动画消失的错误提示框,并在需要的窗口中引用该模板。使用时,通过代码控制提示框的显示和动画效果。

不管是CS还是BS,在需要用户提交数据的页面上,总是要做一些校验,如果校验有错就要给用户提示,WPF里自然也避免不了这个问题。一开始,我是在窗口上预留了一个TextBlock,并且设置其Visibility=Collapsed,当校验有错的时候,再把这个TextBlock显示出来,这样做是可以实现既定需求,但是这样却会影响整个窗口的布局,以下图举个例子:
这里写图片描述
现在这个TextBlock隐藏在输入框和搜索按钮之间,大家知道Visibility=Collapsed是不占布局的,一旦我将Visibility设成了Visible,搜索按钮将会往下移动,这样的体验显然不好;有的同学要说了,那初始时设置Visibility=Hidden好了,这个是占布局的,这样按钮不会下移,的确,按钮是不会下移了,但是这里莫名其妙空白一块也是影响美观的吧。

我们平时见多了APP中或者H5中的页面中央一块黑色背景的提示,这种体验还是比较好的,那在WPF里也实现一个吧~
思路很简单,在每个窗口布局里最外层Grid里与内容快平级放置一个上下左右都居中的框就可以了,然后依照实际情况控制这个框的Visibility属性。显然,这样会有不少的工作量,尤其是项目里窗口比较多的时候。再想想,对,我们要搞一个窗口模板,让有需要的窗口使用这个模板就行了。
新建一个资源字典VcreditWindowWithAlert.xaml,代码如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ControlTemplate x:Key="CustomAlertWindowTemplete" TargetType="Window">      
        <Border BorderBrush="Transparent" BorderThickness="12" x:Name="outBorder">
            <Border.Effect>
                <DropShadowEffect BlurRadius="15" Color="#000000" Opacity=".25" Direction="90" ShadowDepth="1"/>
            </Border.Effect>
            <Grid Background="White">
                <AdornerDecorator>
                    <ContentPresenter></ContentPresenter>
                </AdornerDecorator>
                <Border x:Name="alertBorder" Visibility="Collapsed" Background="#82000000" CornerRadius="8" Padding="6" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="24" MaxWidth="300">
                    <TextBlock x:Name="alertText"  TextWrapping="Wrap" Foreground="White" VerticalAlignment="Center"></TextBlock>
                    <Border.Resources>
                        <Storyboard x:Key="alertStoryboard">
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="alertBorder" Storyboard.TargetProperty="Visibility" Duration="0:0:4">
                                <ObjectAnimationUsingKeyFrames.KeyFrames>
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" >
                                        <DiscreteObjectKeyFrame.Value>
                                            <Visibility>Visible</Visibility>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                    <DiscreteObjectKeyFrame KeyTime="0:0:4" >
                                        <DiscreteObjectKeyFrame.Value>
                                            <Visibility>Collapsed</Visibility>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames.KeyFrames>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </Border.Resources>
                </Border>
            </Grid>
        </Border>
    </ControlTemplate>

    <Style x:Key="CustomAlertWindow" TargetType="Window">
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="Template" Value="{StaticResource CustomAlertWindowTemplete}">     </Setter>
    </Style>
</ResourceDictionary>

稍微解释一下上面代码,可以看到,还是在Grid里与ContentPresenter内容块平级放置了一个Border,这个Border里放置我们要显示的错误信息,并且我们通过一个动画5秒后自动关闭这个错误提示,另外还设置了Border的MaxWidth=”300”,是为了防止窗口较长时,这个Border会过分长。

那么,我们怎么使用上面这个模板呢,首先在App.xaml里要引入一下:

<ResourceDictionary Source="Resources/VcreditWindowWithAlert.xaml"/>

然后在需要使用的窗口里,通过Style属性引用模板:

Style="{StaticResource CustomAlertWindow}"

当需要提示错误的时候,我们通过代码找到那个动画,并且Begin它。以下是我写的一个通用方法,你可以在各个已经引入模板的窗口里调用它:

public static void ShowAlert(Window win, string msg)
{
            ControlTemplate customWindowTemplate = App.Current.Resources["CustomAlertWindowTemplete"] as ControlTemplate;
            if (customWindowTemplate!=null)
            {
                var border = customWindowTemplate.FindName("alertBorder",win) as Border;
                if (border != null)
                {
                    var textblock = border.FindChild<TextBlock>("alertText");
                    textblock.Text = msg;
                    Storyboard sb = border.Resources["alertStoryboard"] as Storyboard;
                    sb.Begin();
                }
            }
}

这里有同学可能没有FindChild方法,这个方法是MahApps.Metro.dll里的,你当然没有必要为了这一个方法去引用这个dll,VisualTreeHelper什么的也是可以实现查找子元素父元素的。

上一下效果图:
这里写图片描述

<think>好的,用户的问题是关于如何去除或调整WPF Frame控件左侧的白色边框。首先,我需要回忆一下WPF中Frame控件的默认样式。通常,Frame控件可能会有默认的内边距或边框,这可能导致出现不需要的白色区域。根据用户提供的引用内容,特别是引用[1]中的ControlTemplate示例,可以看出通过自定义模板可以调整窗口的布局和外观。类似的思路可能适用于Frame控件。用户可能需要覆盖Frame的默认模板,去除内边距或边框属性。接下来,我需要检查Frame控件的默认样式。通常,WPF控件的样式可以通过Blend或文档找到。Frame控件可能包含一个Border元素,设置其BorderThickness或Padding可能导致左侧的白边。因此,解决方案可能是修改模板中的Border属性。另外,引用[3]中的样式示例展示了如何为Button定义样式,这提示用户可以通过为Frame创建自定义样式并设置相关属性(如Padding或BorderThickness)来解决问题。例如,将BorderThickness设置为0,或者调整Padding的值。 还需要考虑Frame的内容是否带有默认边距。例如,如果Frame导航到Page,Page本身的背景或边距也可能导致白边。因此,可能需要同时检查Page的样式设置。综合这些信息,解决方案应包括修改Frame的ControlTemplate,调整内边距和边框属性,并检查内容的影响。可能需要分步骤指导用户如何定位问题,并提供具体的XAML代码示例。</think>### 如何去除WPF Frame控件左侧白色边框? WPF的`Frame`控件默认可能包含边框或内边距,导致左侧出现白色区域。以下是分步解决方案: --- #### 1. **检查默认样式的内边距和边框** `Frame`控件默认可能包含`Padding`或`Border`属性。通过覆盖其模板调整: ```xml <Frame> <Frame.Template> <ControlTemplate TargetType="Frame"> <Border BorderThickness="0" Padding="0"> <ContentPresenter /> </Border> </ControlTemplate> </Frame.Template> </Frame> ``` 通过将`BorderThickness`和`Padding`设为`0`,可消除默认边距[^1][^3]。 --- #### 2. **检查父容器布局影响** 若父容器设置了`Margin`或对齐方式(如`HorizontalAlignment="Left"`),可能导致内容偏移。例如: ```xml <Grid> <Frame HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> </Grid> ``` 通过`HorizontalAlignment="Stretch"`确保内容填满容器[^2]。 --- #### 3. **检查导航内容(Page)的样式** 如果`Frame`导航到`Page`,需确保`Page`本身无背景或边距: ```xml <Page Background="Transparent" Padding="0"> <!-- 内容 --> </Page> ``` --- #### 4. **全局样式覆盖** 在`App.xaml`中定义全局样式避免重复设置: ```xml <Style TargetType="Frame"> <Setter Property="Padding" Value="0"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Frame"> <ContentPresenter /> </ControlTemplate> </Setter.Value> </Setter> </Style> ``` --- ### 相关问题 1. 如何自定义WPF控件的默认模板? 2. Frame控件导航到Page时如何保持样式一致? 3. WPF中如何通过全局样式统一控件外观? 通过上述方法,可定位并解决`Frame`左侧白边问题。若问题仍存在,建议使用工具(如Snoop)检查可视化树结构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值