Проблемы с размером при использовании настраиваемого диалогового элемента управления WPF - PullRequest
2 голосов
/ 16 июня 2010

Я определяю пользовательский элемент управления в WPF, который служит базовым классом для нескольких диалоговых окон, которые используют общие службы (кнопки позиционирования, Ok и Cancel).Пользовательский элемент управления определяется следующим образом:

public class ESDialogControl : Window
{
    static ESDialogControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ESDialogControl), new FrameworkPropertyMetadata(typeof(ESDialogControl)));
    }

    internal ESDialogControl() { }

    public ESDialogControl(string title)
    {
        Title = title;
        this.KeyDown += new KeyEventHandler(ESDialogControl_KeyDown);
    }

    void ESDialogControl_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.Key)
        {
            case Key.Escape: cancelButton_Click(null, null); break;
            case Key.Enter: okButton_Click(null, null); break;
            default: break;
        }
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        _okButton = base.GetTemplateChild("OkButton") as Button;
        _okButton.IsEnabled = false;
        _okButton.Click += new RoutedEventHandler(okButton_Click);

        Button cancelButton = base.GetTemplateChild("CancelButton") as Button;
        cancelButton.Click += new RoutedEventHandler(cancelButton_Click);
    }

    protected Button OkButton { get { return _okButton; } }

    void cancelButton_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = false;
        Close();
    }

    void okButton_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
        Close();
    }

    Button _okButton;
}

И Generic.xaml, который определяет шаблон, выглядит следующим образом:

<Style TargetType="{x:Type local:ESDialogControl}">
    <Setter Property="Width" Value="600" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ESDialogControl}">
                <Grid Height="Auto" Background="Beige" VerticalAlignment="Top" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="1" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <ContentPresenter Grid.Row="0" 
                                      HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                                      Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}" />

                    <Rectangle Grid.Row="1" Fill="Navy" />
                    <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
                        <Button x:Name="OkButton" Width="70" Margin="0 10 10 0">OK</Button>
                        <Button x:Name="CancelButton" Width="70" Padding="2" Margin="0 10 10 0">Cancel</Button>
                    </StackPanel>

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Наконец, я определяю мой новый диалог как производный класс:

<local:ESDialogControl x:Class="Mercersoft.Economica.Studio.View.DialogWindows.NewModelDialog"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:local="clr-namespace:Mercersoft.Economica.Studio.View">
    <Grid Background="Yellow" VerticalAlignment="Top" Height="Auto">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="80" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" HorizontalAlignment="Right">Name:</Label>
        <TextBox x:Name="ItemName"  x:FieldModifier="public" Grid.Column="1" 
                 HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch"
                 VerticalContentAlignment="Center" TextAlignment="Left"
                 TextChanged="ItemName_TextChanged" />

        <Label Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right">Description:</Label>
        <TextBox x:Name="ItemDescription" x:FieldModifier="public" Grid.Row="1" Grid.Column="1" 
                 AcceptsReturn="True" TextWrapping="Wrap" Height="140"
                 HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch"
                 VerticalContentAlignment="Center" TextAlignment="Left" />
    </Grid>
</local:ESDialogControl>

Все ведет себя как ожидалось, за исключением того, что высота главного окна слишком велика.Кажется, он не подходит только для своего содержимого, а расширяет почти всю высоту монитора.Я просмотрел код, чтобы убедиться, что для VerticalAlignments установлено значение Top (а не Stretch), а для свойств Height установлено значение Auto, за исключением текстового поля описания, которое имеет явную высоту.

Какой параметр свойства яотсутствует, чтобы получить этот пользовательский элемент управления для правильного размера?

1 Ответ

2 голосов
/ 17 июня 2010

Вам не хватает настройки SizeToContent="Height" в стиле ESDialogControl.Вы также можете убрать настройку Height="Auto", так как это значение по умолчанию для окна.

...