Время разработки WPF и различия в стилях выполнения с помощью триггеров - PullRequest
7 голосов
/ 04 января 2011

У меня есть большая проблема с тем, как XAML отображается в Design-Time против Run-Time.По большей части все согласованно, но когда я использую любые стили, которые имеют триггер, триггер не проверяется во время разработки.

Вот пример приложения, показывающий, как вещи отображаются по-разному:

<Window x:Class="DesignDifferencesWithDesignAndRuntime.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="400" Width="400">
<Window.Resources>
    <Style x:Key="multiLineInTrigger" TargetType="{x:Type TextBox}">
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="Width" Value="150" />
        <Setter Property="Height" Value="22" />
        <Setter Property="BorderBrush" Value="Blue" />
        <Setter Property="BorderThickness" Value="2" />
        <Style.Triggers>
            <Trigger Property="AcceptsReturn" Value="True">
                <Setter Property="Width" Value="Auto" />
                <Setter Property="Height" Value="Auto" />
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="VerticalAlignment" Value="Stretch" />
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="singleLineInTrigger" TargetType="{x:Type TextBox}">
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="Width" Value="Auto" />
        <Setter Property="Height" Value="Auto" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="VerticalAlignment" Value="Stretch" />
        <Setter Property="BorderBrush" Value="Blue" />
        <Setter Property="BorderThickness" Value="2" />
        <Style.Triggers>
            <Trigger Property="AcceptsReturn" Value="False">
                <Setter Property="Width" Value="150" />
                <Setter Property="Height" Value="22" />
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="VerticalAlignment" Value="Center" />
            </Trigger>
        </Style.Triggers>
    </Style>   
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="HorizontalAlignment" Value="Right" />
    </Style>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Text="Single (Single Style)" Grid.Row="0" Grid.Column="0" />
    <TextBlock Text="Single (Multi Style)" Grid.Row="1" Grid.Column="0" />
    <TextBlock Text="Multi (Single Style)" Grid.Row="2" Grid.Column="0" />
    <TextBlock Text="Multi (Multi Style)" Grid.Row="3" Grid.Column="0" />

    <TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" />
    <TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" />
    <TextBox Grid.Row="2" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" AcceptsReturn="True" />
    <TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" AcceptsReturn="True" />
</Grid>

Я создал два отдельных стиля TextBox, которые делают точно такую ​​же вещь .Когда TextBox однострочный (AcceptsReturn = False), мне нужно, чтобы ширина была 150, а высота - 22. Когда он многострочный (AcceptsReturn = True, очевидно), мне нужны ширина и высота, чтобы растянуть и взятьвверх по всему пространству.

Оба эти триггера прекрасно работают во время выполнения, как показывает выполнение этого кода, но в Design-Time они оба не работают при условии триггера.При использовании стиля «multiLineInTrigger» текстовое поле будет иметь статические значения высоты и ширины (независимо от AcceptsReturn), но при использовании стиля «singleLineInTrigger» элементы управления будут растягиваться независимо от значения AcceptsReturn.

IsЕсть ли решение для этой проблемы?Это стало довольно хлопотно и отнимает много времени для команды разработчиков, потому что они не знают, когда она работает, а когда нет, до компиляции и запуска приложения (что является длительным процессом).

Спасибо.

1 Ответ

5 голосов
/ 05 января 2011

Я видел эту проблему много раз и никогда не видел обходного пути, триггеры не работают в Visual Studio 2010 Designer.Надеюсь, они скоро это исправят.

Единственное решение, которое я могу придумать, - это выполнить проектную работу в Expression Blend 4 , где это работает идеально.Не может быть идеальным, но на данный момент я не думаю, что у вас есть другой выбор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...