Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将静态资源分配给ErrorTemplate内部样式_C#_Wpf_Xaml - Fatal编程技术网

C# 将静态资源分配给ErrorTemplate内部样式

C# 将静态资源分配给ErrorTemplate内部样式,c#,wpf,xaml,C#,Wpf,Xaml,我有一种很好用的风格 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"

我有一种很好用的风格

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:s="clr-namespace:System;assembly=mscorlib"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:Downloader.App.ResourceDictionaries.NamedStyles">

<Style x:Key="TextBoxWithDefaultTextStyle" TargetType="TextBox">

        <!--Padding for typed text-->
        <Setter Property="Padding" Value="5, 2, 5, 0"/>
        <Setter Property="Background" Value="White" />
        <Setter Property="BorderBrush" Value="#FF858585" />
        <Setter Property="BorderThickness" Value="3" />
        <Setter Property="Border.CornerRadius" Value="10" />
        <Setter Property="Control.Template" Value="{StaticResource TextBoxBaseControlTemplate}"></Setter>

        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">

                <Setter Property="Validation.ErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <DockPanel>
                                <Border BorderBrush="Brown" BorderThickness="5"
                    CornerRadius="2">

                                    <AdornedElementPlaceholder x:Name="controlWithError"/>
                                </Border>
                                <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
                            </DockPanel>
                            <ControlTemplate.Triggers>
                                <Trigger Property="Validation.HasError" Value="true">
                                    <Setter Property="Background" Value="Red"/>
                                    <Setter Property="Foreground" Value="White"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

            </Trigger>
        </Style.Triggers>
    </Style>
</ResourceDictionary>
            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

!
然后我想把它放到单独的资源中,就像我使用普通模板一样

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:s="clr-namespace:System;assembly=mscorlib"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:Downloader.App.ResourceDictionaries.NamedStyles">

<Style x:Key="TextBoxWithDefaultTextStyle" TargetType="TextBox">

    <!--Padding for typed text-->
    <Setter Property="Padding" Value="5, 2, 5, 0"/>
    <Setter Property="Background" Value="White" />
    <Setter Property="BorderBrush" Value="#FF858585" />
    <Setter Property="BorderThickness" Value="3" />
    <Setter Property="Border.CornerRadius" Value="10" />
    <Setter Property="Control.Template" Value="{StaticResource TextBoxBaseControlTemplate}"></Setter>
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource TextBoxValidationTemplate}"></Setter>
</Style>
</ResourceDictionary>
            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

TextBoxValidationTemplate.xaml:

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

!

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
然后,我运行应用程序并键入无效数据并获取异常: “{DependencyProperty.UnsetValue}”不是属性“ErrorTemplate”的有效值。

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
如果我直接应用错误模板

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
    <TextBox Text="{Binding UserName, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}"
            Validation.ErrorTemplate="{StaticResource TextBoxValidationTemplate}"
             Style="{StaticResource TextBoxWithDefaultTextStyle}"
             Grid.Row="2"
             Grid.Column="0"
             Margin="5,2,5,2"
             Grid.ColumnSpan="2"/>


它也能正常工作,所以文件正常

我自己找到了。模板必须先使用,然后是样式

            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0">!</TextBlock>
    </DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:Downloader.App.ViewModel" />
                </ResourceDictionary>
                <ResourceDictionary Source="ResourceDictionaries\Templates\TextBoxBaseControlTemplate.xaml" />
                <ResourceDictionary Source="ResourceDictionaries\Templates\TextBoxValidationTemplate.xaml" />
                <ResourceDictionary Source="ResourceDictionaries\Templates\PasswordBoxControlTemplate.xaml" />
                <ResourceDictionary Source="ResourceDictionaries\NamedStyles\TextBoxWithDefaultTextStyle.xaml" />
                <ResourceDictionary Source="ResourceDictionaries\NamedStyles\PasswordBoxStyle.xaml" />
                <ResourceDictionary Source="ResourceDictionaries\Images\Common.xaml" />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>