我在网格中的WPF中有一些TextBlocks,我想根据它们的可用宽度/高度进行缩放.当我搜索自动缩放字体大小时,典型的建议是将TextBlock放入ViewBox.
所以我这样做了:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Viewbox MaxHeight="18" Grid.Column="0" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text1}" />
</Viewbox>
<Viewbox MaxHeight="18" Grid.Column="1" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text2}" />
</Viewbox>
<Viewbox MaxHeight="18" Grid.Column="2" Stretch="Uniform" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Text3}" />
</Viewbox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
它会自动缩放每个TextBlock的字体.但是,这看起来很有趣,因为如果其中一个TextBlocks具有较长的文本,那么它将使用较小的字体,而它的相邻网格元素将使用较大的字体.我希望字体大小按组扩展,如果我可以为一组控件指定"SharedSizeGroup"以自动调整其字体大小,那也许会很好.
例如
第一个文本块文本可能是"3/26/2013 10:45:30 AM",第二个TextBlocks文本可能是"FileName.ext".如果它们跨越窗口的宽度,则用户开始调整窗口的大小越来越小.日期将开始使其字体小于文件名,具体取决于文件名的长度.
理想情况下,一旦其中一个文本字段开始调整字体磅值大小,它们就会匹配.有没有人想出一个解决方案,或者可以让我了解你如何使它工作?如果它需要自定义代码,那么希望我们/我可以将其重新打包为自定义混合或附加行为,以便将来可以重复使用.我认为这是一个相当普遍的问题,但我无法通过搜索找到任何内容.
更新 我尝试了Mathieu的建议,但它有一些副作用:
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="270" Width="522">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Fill="SkyBlue" />
<Viewbox Grid.Row="1" …Run Code Online (Sandbox Code Playgroud) Array.BinarySearch.NET中的文档说它不适用于具有负索引的数组.据我所知,.NET只有具有正索引的数组,并且不允许继承该System.Array类型.
为什么文档说明了这一点以及它是如何实现的?
此方法不支持搜索包含负索引的数组.必须在调用此方法之前对数组进行排序.
我正在尝试使用DataTemplate从我的ViewModels创建一个关于MVVM的菜单.基本上,我已经创建了几个类来存储有关我的Menu结构的信息.然后,我想要使用DataTemplate将菜单结构视为WPF菜单.
我有一个菜单服务,允许不同的组件在菜单中注册新的菜单和项目.这是我如何组织我的菜单信息(ViewModel)
我有以下类:MainMenuViewModel - 包含TopLevelMenuViewModelCollection(顶级菜单的集合)
TopLevelMenuViewModel - 包含MenuItemGroupViewModelCollection(菜单项组的集合),以及菜单"Text"的名称
MenuItemGroupViewModel - 包含MenuItemViewModelCollection(菜单项的集合)
MenuItemViewModel - 包含text,image uri,command,children MenuItemViewModels
我想要做的是将DataTemplate应用于以前的类,将它们转换为普通的菜单.
MainMenuViewModel - >菜单
TopLevelMenuViewModel - >带有标题集的MenuItems
MenuItemGroupViewModel - > Separator,后跟每个MenuItemViewModel的MenuItem
MenuItemViewModel - > MenuItem(HeirarchicalDataTemplate)
问题是我没有看到如何为MenuItemGroupViewModel生成多个MenuItem.Menu模板希望始终为每个项目创建一个ItemContainer,它是一个MenuItem.因此,我要么最终在MenuItem中使用我的MenuItems,这显然不起作用,或者根本不起作用.我已经尝试了几件事,仍然无法弄清楚如何让一个项目产生多个MenuItem.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:--">
<!-- These data templates provide the views for the menu -->
<!-- MenuItemGroupView -->
<Style x:Key="MenuItemGroupStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="qqq" />
<!-- Now what? I don't want 1 item here..
I wanted this to start with a <separator /> and list the …Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft Prism和Unity 编写模块化应用程序.我的应用程序的Shell项目加载各种DLL,这些DLL都包含自己的/ resources或/ images文件夹和用户界面视图.因此,每个模块都是DLL.
当我尝试在我的应用程序中使用资源时,似乎我必须非常清楚它的位置以使其工作.例如,要在同一模块/ dll中定位图像:
<Image Source="pack://application:,,,/MyCompany.MyProduct.MyModule;Component/Images/ZoomIn.gif" />
Run Code Online (Sandbox Code Playgroud)
我是否真的每次都必须使用URI的长格式版本?我尝试过更短的版本,例如:
pack://application:,,,/Images/ZoomIn.gif
Images/ZoomIn.gif
ZoomIn.gif
Run Code Online (Sandbox Code Playgroud)
等等
我想也许第二个版本应该有效.当我看到Uri的例子时,他们经常说"相对于当前的集会".这是正在运行的可执行程序的程序集吗?或者这是代码所属的程序集(我的库/模块)?
更新:
在Peter Hansen的帮助下,我能够将其缩短为:
<Image Source="../Images/ZoomOut.png" />
Run Code Online (Sandbox Code Playgroud)
显然我不得不使用../因为我的视图是在子文件夹中.我也可以放弃pack://语法,因为类型转换器为我做了这个.