如何在调整窗口大小时重新定位装饰器?

时间:2017-12-12 11:06:17

标签: c# wpf validation xaml adorner

我有一个装饰来显示错误消息,问题是当窗口很小时,消息会在窗口下被剪切。 因此,我尝试根据窗口大小重新定位装饰器到按钮或左侧,或者用户是否调整了窗口大小。

文本框:

<TextBox IsReadOnly="False" Grid.Column="3" Grid.Row="0" Text="{Binding TextValue}" />

式:

<ControlTemplate x:Key="errorToolTipTemplate">
    <ControlTemplate.Resources>
        <Style x:Key="textblockErrorTooltip" TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="Margin" Value="10 0 10 0" />
        </Style>
    </ControlTemplate.Resources>
    <DockPanel LastChildFill="true">
        <Border Height="Auto" Margin="4,0,0,0" Background="Tomato" BorderBrush="Black" BorderThickness="1" CornerRadius="2" DockPanel.Dock="Right">
            <TextBlock Style="{StaticResource textblockErrorTooltip}" Text="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
        </Border>
        <AdornedElementPlaceholder Name="customAdorner">
            <Border BorderBrush="Red" BorderThickness="1" />
        </AdornedElementPlaceholder>
    </DockPanel>
</ControlTemplate>

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Width" Value="120" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="Margin" Value="0,2,4,2" />
    <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource errorToolTipTemplate}" />
    <!--<Setter Property="FontSize" Value="8" />-->
    <Setter Property="Background" Value="{DynamicResource entryFieldsBrush}" />
    <Style.Triggers>
        <Trigger Property="IsReadOnly" Value="True">
            <Setter Property="Background" Value="{StaticResource windowBrush}" />
        </Trigger>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
        </Trigger>
    </Style.Triggers>
</Style>

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以设置装饰元素的右边距,以防止装饰图层被裁剪。

如果您希望能够动态执行此操作,您可以例如处理LoadedTextBlock的{​​{1}}事件,并设置已装饰的ErrorTemplate Margin TextBlock的元素加上一些偏移量,例如:

ActualWidth
<DockPanel LastChildFill="true">
    <Border Height="Auto" Margin="4,0,0,0" Background="Tomato" BorderBrush="Black" BorderThickness="1" 
            CornerRadius="2" DockPanel.Dock="Right">
        <TextBlock Text="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                   Loaded="TextBlock_Loaded"/>
    </Border>
    <AdornedElementPlaceholder Name="customAdorner">
        <Border BorderBrush="Red" BorderThickness="1" />
    </AdornedElementPlaceholder>
</DockPanel>

答案 1 :(得分:0)

使用popups是我的方法。此链接here有一个弹出错误消息的工作示例。

  

Popup控件提供了一种在单独的内容中显示内容的方法   窗口相对于a浮动在当前应用程序窗口上   指定的元素或屏幕坐标。本主题介绍   弹出控件并提供有关其使用的信息。   source