Wpf 将输入表单更改为显示表单

Wpf 将输入表单更改为显示表单,wpf,xaml,Wpf,Xaml,一些背景: 用户使用多输入控件(标准文本框、组合框等)在窗口中输入数据 用户以-readmode-显示以前输入的数据打开同一窗口 当然,输入表单很简单,对于readmode,我可以使用IsEnabled DependencyProperty禁用输入控件 是否可以使用带触发器的样式将所有输入控件替换为标签。正如您所猜测的,样式上有一个触发器可以更改控件模板 <Window x:Class="SO_Xaml_ReadOnlyInputForm.MainWindow" xml

一些背景:

  • 用户使用多输入控件(标准文本框、组合框等)在窗口中输入数据

  • 用户以-readmode-显示以前输入的数据打开同一窗口

当然,输入表单很简单,对于readmode,我可以使用IsEnabled DependencyProperty禁用输入控件


是否可以使用带触发器的样式将所有输入控件替换为标签。正如您所猜测的,样式上有一个触发器可以更改控件模板

<Window x:Class="SO_Xaml_ReadOnlyInputForm.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.Resources>

            <Style TargetType="TextBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsReadOnly}"
                                 Value="True">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="TextBox">
                                    <TextBlock Text="{TemplateBinding Text}"
                                               Width="{TemplateBinding Width}" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>

        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />          
        </Grid.RowDefinitions>

        <CheckBox Grid.Row="0"
                  IsChecked="{Binding IsReadOnly}"
                  Content="Is Read-only?" />
        <StackPanel Grid.Row="1"
                    Orientation="Horizontal">
            <TextBlock>Item1</TextBlock>
            <TextBox Text="{Binding Item1Text}"
                     Width="100" />
        </StackPanel>
    </Grid>
</Window>

当IsReadOnly为true时,这会将所有文本框转换为文本块。正如您所猜测的,样式上有一个触发器可以更改控件模板

<Window x:Class="SO_Xaml_ReadOnlyInputForm.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.Resources>

            <Style TargetType="TextBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsReadOnly}"
                                 Value="True">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="TextBox">
                                    <TextBlock Text="{TemplateBinding Text}"
                                               Width="{TemplateBinding Width}" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>

        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />          
        </Grid.RowDefinitions>

        <CheckBox Grid.Row="0"
                  IsChecked="{Binding IsReadOnly}"
                  Content="Is Read-only?" />
        <StackPanel Grid.Row="1"
                    Orientation="Horizontal">
            <TextBlock>Item1</TextBlock>
            <TextBox Text="{Binding Item1Text}"
                     Width="100" />
        </StackPanel>
    </Grid>
</Window>