C# 如何适应WPF菜单项';s大小基于it子项';s码
我有上下文菜单。其中一个菜单项包含combobox。 当呈现带有组合框的菜单项时,菜单项比组合框宽得多。 你知道我如何将菜单项的大小设置到组合框中吗。 以下是我如何创建菜单和组合框:C# 如何适应WPF菜单项';s大小基于it子项';s码,c#,wpf,combobox,menuitem,C#,Wpf,Combobox,Menuitem,我有上下文菜单。其中一个菜单项包含combobox。 当呈现带有组合框的菜单项时,菜单项比组合框宽得多。 你知道我如何将菜单项的大小设置到组合框中吗。 以下是我如何创建菜单和组合框: XamComboEditor combo = new XamComboEditor(); combo.ItemsSource = Context.RecipientOptions; combo.DisplayMemberPath = "Display"; combo.IsEditable = true; combo
XamComboEditor combo = new XamComboEditor();
combo.ItemsSource = Context.RecipientOptions;
combo.DisplayMemberPath = "Display";
combo.IsEditable = true;
combo.MinWidth = 250;
combo.DropDownResizeMode = PopupResizeMode.None;
combo.HorizontalAlignment = HorizontalAlignment.Stretch;
combo.LimitToList = false;
combo.SetBinding(XamComboEditor.SelectedItemProperty, new Binding("Recipient")
{Source = this, Mode = BindingMode.TwoWay});
MenuItem comboMenu = new MenuItem {Header = combo, StaysOpenOnClick = true,
RenderSize = combo.RenderSize,};
menu.Items.Add(comboMenu);
MenuItem removeMenu = new MenuItem {Header = "Remove this recipient"};
removeMenu.Click += (sender, e) => RemoveRecipient();
removeMenu.IsEnabled = ActionSet.Actions.Count > 1 || Recipient != null;
menu.Items.Add(removeMenu);
我试图设置RenderSize,但在运行时它是零
谢谢。是来自Microsoft MenuItem ControlTemplate示例的链接。您可以编辑此项以获得所需的方面。
例如,在这个xaml中:
<ControlTemplate x:Key="{x:Static MenuItem.SubmenuItemTemplateKey}" TargetType="MenuItem">
<Border Name="Border" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Icon"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
<ColumnDefinition Width="13"/>
</Grid.ColumnDefinitions>
<ContentPresenter Name="Icon" Margin="6,0,6,0" VerticalAlignment="Center" ContentSource="Icon"/>
<Border Name="Check"
Width="13" Height="13"
Visibility="Collapsed"
Margin="6,0,6,0"
Background="{StaticResource NormalBrush}"
BorderThickness="1"
BorderBrush="{StaticResource NormalBorderBrush}">
<Path Name="CheckMark"
Width="7" Height="7"
Visibility="Hidden"
SnapsToDevicePixels="False"
Stroke="{StaticResource GlyphBrush}"
StrokeThickness="2"
Data="M 0 0 L 7 7 M 0 7 L 7 0" />
</Border>
<ContentPresenter Name="HeaderHost"
Grid.Column="1"
ContentSource="Header"
RecognizesAccessKey="True"/>
<TextBlock x:Name="InputGestureText"
Grid.Column="2"
Text="{TemplateBinding InputGestureText}"
Margin="5,2,0,2"
DockPanel.Dock="Right" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Icon" Value="{x:Null}">
<Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="CheckMark" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="IsCheckable" Value="true">
<Setter TargetName="Check" Property="Visibility" Value="Visible"/>
<Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
如果不需要某些列,可以编辑Grid.com定义以调整其大小,甚至删除它们。
如果您从单独的ResourceDictionary中的链接添加controlTemplate(我建议您这样做),请不要忘记也将其添加到App.xaml文件的MergeDictionary中,以使其在整个应用程序中可见。
如果您直接将其添加到应用程序的根目录中,请执行以下操作:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/YourApplicationName;component\MenuStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
我希望这可以帮助您解决问题。是来自Microsoft MenuItem ControlTemplate示例的链接。您可以编辑此项以获得所需的方面。
例如,在这个xaml中:
<ControlTemplate x:Key="{x:Static MenuItem.SubmenuItemTemplateKey}" TargetType="MenuItem">
<Border Name="Border" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Icon"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
<ColumnDefinition Width="13"/>
</Grid.ColumnDefinitions>
<ContentPresenter Name="Icon" Margin="6,0,6,0" VerticalAlignment="Center" ContentSource="Icon"/>
<Border Name="Check"
Width="13" Height="13"
Visibility="Collapsed"
Margin="6,0,6,0"
Background="{StaticResource NormalBrush}"
BorderThickness="1"
BorderBrush="{StaticResource NormalBorderBrush}">
<Path Name="CheckMark"
Width="7" Height="7"
Visibility="Hidden"
SnapsToDevicePixels="False"
Stroke="{StaticResource GlyphBrush}"
StrokeThickness="2"
Data="M 0 0 L 7 7 M 0 7 L 7 0" />
</Border>
<ContentPresenter Name="HeaderHost"
Grid.Column="1"
ContentSource="Header"
RecognizesAccessKey="True"/>
<TextBlock x:Name="InputGestureText"
Grid.Column="2"
Text="{TemplateBinding InputGestureText}"
Margin="5,2,0,2"
DockPanel.Dock="Right" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Icon" Value="{x:Null}">
<Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="CheckMark" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="IsCheckable" Value="true">
<Setter TargetName="Check" Property="Visibility" Value="Visible"/>
<Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
如果不需要某些列,可以编辑Grid.com定义以调整其大小,甚至删除它们。
如果您从单独的ResourceDictionary中的链接添加controlTemplate(我建议您这样做),请不要忘记也将其添加到App.xaml文件的MergeDictionary中,以使其在整个应用程序中可见。
如果您直接将其添加到应用程序的根目录中,请执行以下操作:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/YourApplicationName;component\MenuStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
我希望这可能会帮助您解决问题。意识到我在玩了w/it之后忘记将水平对齐更改为拉伸。为了删除该空间,您必须编辑MenuItem控件的控件模板。已为InputGestureText分配了空间,该图标显示您有此项目的子项,等等。Olimpiu,谢谢您,很抱歉延迟答复,我不知道您已答复,我想在收到答复时会收到通知。你有没有一个关于如何做的例子?意识到我在玩了它之后忘记了将水平对齐更改为拉伸。为了删除该空间,你必须编辑MenuItem控件的控件模板。已为InputGestureText分配了空间,该图标显示您有此项目的子项,等等。Olimpiu,谢谢您,很抱歉延迟答复,我不知道您已答复,我想在收到答复时会收到通知。你有没有一个例子来说明如何做到这一点?我创建了单独的xaml文件,并在我的控件中添加了TryFindResource(新的ComponentResourceKey(typeof(MenuItem),“subnumitemcombo”);找不到它,有什么想法吗?只有当我“手动”将其加载到Windows的MergedDictionarises时,我才能成功。在您的资源字典中有一个带有x:Key=“subnumItemCombo”的ControlTemplate?是的,我在MenuItemTemplateResources.xaml中定义,问题是代码正在模型的RelayCommand中查找模板,该模板除了窗口之外没有引用任何控件(我认为应该是这样的)……请尝试这样获取资源:var searchedControlTemplate=Application.Current.Resources[“subnumitemcombo”];。我创建了单独的xaml文件,并在控件中添加了TryFindResource(新的ComponentResourceKey(typeof(MenuItem),“subnumitemcombo”);找不到它,有什么想法吗?只有当我“手动”将其加载到Windows的MergedDictionarises时,我才能成功。在您的资源字典中有一个带有x:Key=“subnumItemCombo”的ControlTemplate?是的,我在MenuItemTemplateResources.xaml中定义,问题是代码正在模型的RelayCommand中查找模板,该模板除了窗口之外没有引用任何控件(我认为应该是这样的)……请尝试这样获取资源:var searchedControlTemplate=Application.Current.Resources[“subnumitemcombo”];。