WPF MaterialDesignFilledComboBox - 垂直居中提示文本
WPF MaterialDesignFilledComboBox - Center HintText vertically
我有一个使用 MaterialDesignFilledComboBox
样式的 ComboBox。
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.Hint="Some hint text"
</ComboBox>
注意 materialDesign:HintAssist.Hint="Some hint text"
属性.
的赋值
当我没有在 ComboBox 的下拉菜单中选择项目时,Hint
属性(“一些提示文本”)是 ComboBox 中唯一可见的文本。没关系。
在提示上方,有一个“未使用的space”。
如果我 select 下拉菜单中的一个项目,“未使用的 space” 被 Hint
占用并显示“一些提示文本”。
问题
当下拉菜单中没有项目 select 时,我的设计师不喜欢“space 以上”。
当没有 项目 selected?
时,是否可以将 Hint
在 ComboBox 中垂直居中
我的发现
查看 MaterialDesignFilledComboBox
的模板 (MaterialDesignFloatingHintComboBoxTemplate)。
我在第 374 - 397 行找到了 SmartHint
控件。这个控件似乎是提示的占位符。
如果我将此样式作为资源添加到 ComboBox,我对 ComboBox 中的 SmartHint
对象有一些有限的控制。
例如:
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.Hint="Some hint text"
<ComboBox.Resources>
<Style TargetType="materialDesign:SmartHint">
<Setter Property="VirtualizingPanel.Visibility" Value="Collapsed" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
<ComboBox.Resources>
</ComboBox>
setter 和 Visibility = Collapsed
确实有效。
VerticalAlignment
和 VerticalContentAlignment
属性的 setter 不起作用。即使他们会工作,他们也不会给我我想要的确切结果,而是证明我可以通过某种方式控制控件的位置。
有什么建议吗?
/BR
史蒂夫
尝试更改填充属性
<Setter Property="Padding" Value="0 -10 0 0" />
尝试将 ComboBox
的 HintAssist.IsFloating
附加 属性 设置为 false
:
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.IsFloating="False"
materialDesign:HintAssist.Hint="Some hint text" />
您可以根据是否使用 Style
:
选择项目来有条件地设置它
<ComboBox ItemsSource="{Binding SomeData}" materialDesign:HintAssist.Hint="Some hint text">
<ComboBox.Style>
<Style TargetType="ComboBox" BasedOn="{StaticResource MaterialDesignFilledComboBox}">
<Setter Property="materialDesign:HintAssist.IsFloating" Value="True" />
<Style.Triggers>
<Trigger Property="SelectedItem" Value="{x:Null}">
<Setter Property="materialDesign:HintAssist.IsFloating" Value="False" />
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
Thanks to @mm8 I found a way to partially solve this problem...But there is a problem with the graphics of the ComboBox
When I select the first item in the drop-down-menu, both the hint text and the text of the selected item, get all merged/mangled together into an unreadable mess.
这是 third-party 控件的缺陷。
您可以通过处理 SelectionChanged
并以编程方式调用 SmartHint
的 ApplyTemplate
方法来解决它:
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cmb = (ComboBox)sender;
HintAssist.SetIsFloating(cmb, cmb.SelectedItem != null);
SmartHint smartHint = FindVisualChild<SmartHint>(cmb);
if (smartHint != null)
{
smartHint.ApplyTemplate();
}
}
private static T FindVisualChild<T>(Visual visual) where T : Visual
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
Visual child = (Visual)VisualTreeHelper.GetChild(visual, i);
if (child != null)
{
T correctlyTyped = child as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
T descendent = FindVisualChild<T>(child);
if (descendent != null)
{
return descendent;
}
}
}
return null;
}
XAML:
<ComboBox ItemsSource="{Binding SomeData}"
SelectionChanged="OnSelectionChanged"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.IsFloating="False"
materialDesign:HintAssist.Hint="Some hint text" />
我有一个使用 MaterialDesignFilledComboBox
样式的 ComboBox。
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.Hint="Some hint text"
</ComboBox>
注意 materialDesign:HintAssist.Hint="Some hint text"
属性.
的赋值
当我没有在 ComboBox 的下拉菜单中选择项目时,Hint
属性(“一些提示文本”)是 ComboBox 中唯一可见的文本。没关系。
在提示上方,有一个“未使用的space”。
如果我 select 下拉菜单中的一个项目,“未使用的 space” 被 Hint
占用并显示“一些提示文本”。
问题
当下拉菜单中没有项目 select 时,我的设计师不喜欢“space 以上”。
当没有 项目 selected?
Hint
在 ComboBox 中垂直居中
我的发现
查看 MaterialDesignFilledComboBox
的模板 (MaterialDesignFloatingHintComboBoxTemplate)。
我在第 374 - 397 行找到了 SmartHint
控件。这个控件似乎是提示的占位符。
如果我将此样式作为资源添加到 ComboBox,我对 ComboBox 中的 SmartHint
对象有一些有限的控制。
例如:
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.Hint="Some hint text"
<ComboBox.Resources>
<Style TargetType="materialDesign:SmartHint">
<Setter Property="VirtualizingPanel.Visibility" Value="Collapsed" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
<ComboBox.Resources>
</ComboBox>
setter 和 Visibility = Collapsed
确实有效。
VerticalAlignment
和 VerticalContentAlignment
属性的 setter 不起作用。即使他们会工作,他们也不会给我我想要的确切结果,而是证明我可以通过某种方式控制控件的位置。
有什么建议吗?
/BR
史蒂夫
尝试更改填充属性
<Setter Property="Padding" Value="0 -10 0 0" />
尝试将 ComboBox
的 HintAssist.IsFloating
附加 属性 设置为 false
:
<ComboBox ItemsSource="{Binding SomeData}"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.IsFloating="False"
materialDesign:HintAssist.Hint="Some hint text" />
您可以根据是否使用 Style
:
<ComboBox ItemsSource="{Binding SomeData}" materialDesign:HintAssist.Hint="Some hint text">
<ComboBox.Style>
<Style TargetType="ComboBox" BasedOn="{StaticResource MaterialDesignFilledComboBox}">
<Setter Property="materialDesign:HintAssist.IsFloating" Value="True" />
<Style.Triggers>
<Trigger Property="SelectedItem" Value="{x:Null}">
<Setter Property="materialDesign:HintAssist.IsFloating" Value="False" />
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
Thanks to @mm8 I found a way to partially solve this problem...But there is a problem with the graphics of the ComboBox When I select the first item in the drop-down-menu, both the hint text and the text of the selected item, get all merged/mangled together into an unreadable mess.
这是 third-party 控件的缺陷。
您可以通过处理 SelectionChanged
并以编程方式调用 SmartHint
的 ApplyTemplate
方法来解决它:
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cmb = (ComboBox)sender;
HintAssist.SetIsFloating(cmb, cmb.SelectedItem != null);
SmartHint smartHint = FindVisualChild<SmartHint>(cmb);
if (smartHint != null)
{
smartHint.ApplyTemplate();
}
}
private static T FindVisualChild<T>(Visual visual) where T : Visual
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
Visual child = (Visual)VisualTreeHelper.GetChild(visual, i);
if (child != null)
{
T correctlyTyped = child as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
T descendent = FindVisualChild<T>(child);
if (descendent != null)
{
return descendent;
}
}
}
return null;
}
XAML:
<ComboBox ItemsSource="{Binding SomeData}"
SelectionChanged="OnSelectionChanged"
Style="{StaticResource MaterialDesignFilledComboBox}"
materialDesign:HintAssist.IsFloating="False"
materialDesign:HintAssist.Hint="Some hint text" />