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