动态创建窗口时,按钮会对齐到中心

时间:2014-01-13 16:13:44

标签: c# wpf xaml user-interface wpf-controls

我在运行时动态创建一个窗口。我有自定义按钮。我需要在运行时根据请求得到“是,否”,“确定,取消”,“确定”,“是,否,取消”。我在这里有图片。 此图描绘了,当按钮的水平对齐方式为右时。我没有得到右侧的两个按钮。在这种情况下,你能帮帮我吗?我也在下面分享了我的代码。问题是Button Collection将行划分为我们需要的按钮数。 When the Horizontal Alignment is Right and buttons are resized

我的代码。

internal sealed class MessageBoxModule : Window
{
    private static Style _ctrlButtonStyle;
    public new static readonly DependencyProperty TitleProperty;
    public static readonly DependencyProperty MessageProperty;
    public static readonly DependencyProperty ButtonCollectionProperty =
    DependencyProperty.Register("ButtonCollection", typeof(IList<Button>), typeof(MessageBoxModule), new PropertyMetadata(new List<Button>()));

    public MessageBoxModule()
    {
        WindowStartupLocation = WindowStartupLocation.CenterScreen;
        AllowsTransparency = true;WindowStyle = WindowStyle.None;
        //...
    }
}

public static MessageBoxResult Show(Window owner, string messageBoxText, string caption)   
{
    var mbox = new MessageBoxModule();
    boxes.Add(mbox); mbox.Message = messageBoxText; mbox.Title = caption;
    switch (button)
    {
        case MessageBoxButton.OKCancel:
            mbox.ButtonCollection.Add(CreateButton(mbox, "OK"));
            mbox.ButtonCollection.Add(CreateButton(mbox, "Cancel"));
            break;
        //.... And so on.
    }
    var result = mbox.ShowDialog();
    switch (button)
    {
        case MessageBoxButton.YesNoCancel://and so on.
    }
}
private static Button CreateButton(string content, bool isCancel, RoutedEventHandler clickHandler)
{
    Button btn = new Button();
    btn.Padding = new Thickness(20, 3, 20, 3);
    btn.Content = content;
    btn.Style = _ctrlButtonStyle;//Custom button Style in WPF
    btn.Click += clickHandler;
    btn.Height = 25; btn.Width = 75;
    return btn;
}

MessageBox样式:此处,垂直和水平对齐设置为居中。即使我将其改为正确,我也有像图片中那样的问题。

<ControlTemplate x:Key="MessageBoxCt"
                     TargetType="{x:Type Helper:MessageBoxModule}">
        <Border Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                CornerRadius="3" Margin="8">
            <Grid x:Name="grid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="auto" />
                </Grid.RowDefinitions>
                <TextBlock x:Name="textBlock" Text="{TemplateBinding Title}"/>
                <Border Grid.Row="0" BorderThickness="0,0,0,1"/>
                <TextBlock Text="{TemplateBinding Message}"Grid.Row="1"Margin="10"TextTrimming="None"Foreground="{TemplateBinding Foreground}"
                           TextWrapping="WrapWithOverflow"FontSize="{TemplateBinding FontSize}" />
                <ItemsControl Grid.Row="2"Margin="10"ItemsSource="{TemplateBinding ButtonCollection}"
                              ScrollViewer.VerticalScrollBarVisibility= "Disabled"HorizontalContentAlignment="Right"VerticalContentAlignment="Center"Padding="0,0,5,0">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Rows="1" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </Grid>
        </Border>
    </ControlTemplate>

2 个答案:

答案 0 :(得分:3)

UniformGrid行中的每个项目都采用相同的宽度,而HorizontalContentAlignment="Right"内的按钮将右对齐。请尝试HorizontalAlignment="Right",然后右对齐完整的ItemsControl

<ItemsControl Grid.Row="2"
              ...
              HorizontalAlignment="Right">
    ...
</ItemsControl>

答案 1 :(得分:1)

没有你的代码的人很难猜到这里发生了什么。我的猜测是你的RowDefinition不正确...为什么你有一套"*"?如果所有设置为Width "Auto"并且Grid设置为HorizontalAlignment="Right",则效果会更好。

您还可以将Grid.ShowGridLines property设置为True,这样可以为您提供有关实际正在发生的内容的更多线索。

说实话,你的整个尝试似乎都是错的......这是WPF,而不是WinForms。您不应该创建UI元素并将其从后面的代码添加到UI中。正确使用WPF时,您的要求更容易实现。

首先将所有 Button添加到UI XAML中。接下来,为每个属性添加bool属性到您的视图模型或后面的代码中。然后,只需使用BooleanToVisibilityConverter数据将这些bool属性绑定到Visiblity的{​​{1}}属性。现在,要让每个Button可见,您需要做的就是将其相关的Button属性设置为bool

true