2010-06-16 102 views
2

我在WPF中定義了一個自定義控件,它用作多個對話框窗口的基類,這些窗口都利用共享服務(定位,確定和取消按鈕)。自定義控制的定義如下:使用自定義WPF對話框控件時的大小問題

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,除了具有明確高度的描述文本框。

我錯過了哪些屬性設置讓自定義控件的大小正確?

回答

2

您錯過了ESDialogControl風格的SizeToContent="Height"設置。您也可以刪除Height="Auto"設置,因爲這是窗口的默認設置。

+0

今天學到了新東西! Thx設置SizeToContent樣式解決了我的問題。 – 2010-06-16 21:19:46