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,除了具有明確高度的描述文本框。
我錯過了哪些屬性設置讓自定義控件的大小正確?
今天學到了新東西! Thx設置SizeToContent樣式解決了我的問題。 – 2010-06-16 21:19:46