我有一个用于设置字体大小的RibbonComboBox。它有一个RibbonGallery,列出了各种字体大小,并以相应的FontSize显示:

<r:RibbonComboBox DataContext="{x:Static vm:RibbonDataModel.FontSizeComboBoxData}"
                  SelectionBoxWidth="30">
   <r:RibbonGallery MaxColumnCount="1"
                    Command="{Binding Command}"
                    CommandParameter="{Binding SelectedItem}">
      <r:RibbonGallery.GalleryItemTemplate>
         <DataTemplate>
            <Grid>
               <TextBlock Text="{Binding}"
                          FontSize="{Binding}" />
            </Grid>
         </DataTemplate>
      </r:RibbonGallery.GalleryItemTemplate>
   </r:RibbonGallery>
</r:RibbonComboBox>

编辑这是我的ViewModel:
public static RibbonDataModel
{
  public static GalleryData<object> FontSizeComboBoxData
  {
     get
     {
        lock (LockObject)
        {
           const string key = "Font Size";
           if (!DataCollection.ContainsKey(key))
           {
              var value = new GalleryData<object>
              {
                 Command = HtmlDocumentCommands.ChangeFontSize,
                 Label = "Change Font Size",
                 ToolTipDescription = "Set the font to a specific size.",
                 ToolTipTitle = "Change Font Size",
              };

              var fontSizes = new GalleryCategoryData<object>();
              var i = 9.0;
              while (i <= 30)
              {
                 fontSizes.GalleryItemDataCollection.Add(i);
                 i += 0.75;
              }
              value.CategoryDataCollection.Add(fontSizes);
              DataCollection[key] = value;
           }
           return DataCollection[key] as GalleryData<object>;
        }
     }
  }
}

一切都按预期工作,但是当我从图库中选择一个项目后,它会在RibbonComboBox中显示,并且与图库中使用的巨大(或微小)FontSize相同。

当显示在FontSize中时,如何将所选项目的RibbonComboBox重置为默认值?

最佳答案

RibbonComboBox使用ContentPresenter来显示您在RibbonGallery中选择的项目。
此外,ContentPresenter采用您在ItemTemplate中声明的相同RibbonGallery
这是您的问题的“核心”原因。

因此,您可以在两种解决方案之间选择,以解决此问题。

第一解决方案(最快的解决方案)

您可以简单地将RibbonComboBox的IsEditable属性设置为“true”。这样,RibbonComboBox可以用TextBox替换ContentPresenter,而无需使用任何ItemTemplate。然后,字体将具有正确的大小。

第二种解决方案(最好的IMHO)

由于从RibbonComboBox的ContentPresenter和RibbonGallery中都使用了ItemTemplate,因此可以尝试解决问题。唯一的区别是,将DataTemplate放置在RibbonGallery内时,其父项是RibbonGalleryItem
因此,如果其父级不是RibbonGalleryItem,您会自动知道DataTemplate放置在ContentPresenter内部。
您可以通过编写一个简单的DataTrigger来处理这种情况。
让我们看一下代码中的所有内容。

我写了一个简化的ViewModel:

namespace WpfApplication1
{
    public class FontSizes
    {
        private static FontSizes instance = new FontSizes();
        private List<double> values = new List<double>();

        public FontSizes()
        {
            double i = 9.0;
            while (i <= 30)
            {
                values.Add(i);
                i += 0.75;
            }
        }

        public IList<double> Values
        {
            get
            {
                return values;
            }
        }

        public static FontSizes Instance
        {
            get
            {
                return instance;
            }
        }
    }
}

这就是我的观点:
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ribbon="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon"
        xmlns:vm="clr-namespace:WpfApplication1"
        Title="Window1" Height="300" Width="300">
    <Window.Resources />

    <DockPanel>
        <ribbon:RibbonComboBox Label="Select a font size:"
                  SelectionBoxWidth="62"
                  VerticalAlignment="Center">

        <ribbon:RibbonGallery MaxColumnCount="1">
                <ribbon:RibbonGalleryCategory DataContext="{x:Static vm:FontSizes.Instance}" ItemsSource="{Binding Path=Values, Mode=OneWay}">
                    <ribbon:RibbonGalleryCategory.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <TextBlock Name="tb" Text="{Binding}" FontSize="{Binding}" />
                            </Grid>

                            <DataTemplate.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ribbon:RibbonGalleryItem, AncestorLevel=1}}"
                                             Value="{x:Null}">
                                    <Setter TargetName="tb" Property="FontSize" Value="12" />
                                </DataTrigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </ribbon:RibbonGalleryCategory.ItemTemplate>
                </ribbon:RibbonGalleryCategory>
            </ribbon:RibbonGallery>
        </ribbon:RibbonComboBox>
    </DockPanel>
</Window>

如您所见,DataTrigger是构成“脏工作”的“组件”。

现在,您只需确定要使用哪种解决方案即可。

关于WPF::与RibbonGallery风格不同的RibbonComboBox样式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29721291/

10-10 08:30