WPF:如何在对话框单位中指定单位?

WPF:如何在对话框单位中指定单位?,wpf,windows,xaml,dpi,Wpf,Windows,Xaml,Dpi,我试图弄清楚如何使用适当的对话框单元(dlu)在WPF中布局一个简单的对话框 什么是对话单元? 对话框是基于用户首选字体大小的度量单位。 对话框单元的定义使得平均字符数为4个对话框 单位宽8对话框单位高: 这意味着对话框单元: 使用所选字体进行更改 使用选定的DPI设置进行更改 它们不是正方形的 我花了大约两个小时在WindowsVista中用各种dlu测量值标注这个示例对话框。有人能给出生成此对话框的相应XAML标记吗 () 现在我承认我对WPF XAML几乎一无所知。每次我开始的

我试图弄清楚如何使用适当的对话框单元(dlu)在WPF中布局一个简单的对话框


什么是对话单元? 对话框是基于用户首选字体大小的度量单位。 对话框单元的定义使得平均字符数为4个对话框 单位宽8对话框单位高:

这意味着对话框单元:

  • 使用所选字体进行更改
  • 使用选定的DPI设置进行更改
  • 它们不是正方形的

我花了大约两个小时在WindowsVista中用各种dlu测量值标注这个示例对话框。有人能给出生成此对话框的相应XAML标记吗

()

现在我承认我对WPF XAML几乎一无所知。每次我开始的时候,我都会受到阻碍,因为我不知道如何放置任何控件。似乎WPF中的所有内容都必须包含在某种面板上。有StackPanels、FlowPanels、DockPanel等。如果没有它们中的任何一个,它将无法编译

到目前为止,我唯一能想到的XAML(使用XAMLPad):


是否确实要将此文件移动到回收站?
117__6.jpg
类型:ACDSee JPG图像
评级:未评级
尺寸:1072×712
它呈现为一个华而不实的怪物。没有一个控件的位置或大小正确。我不知道如何在窗口中定位控件,也无法正确调整控件的大小

有人能把截图转换成XAML吗

注意:不允许您测量屏幕截图。指定了所有对话框单元(dlu)的宽度和高度

注意:1个水平DLU!=1个垂直DLU。水平和垂直DLU的大小不同


另见

Bump:6/20/2011

查看-它支持相对大小调整。

以下XAML将为您提供所需的效果

请注意,我已将标记中的DLU单位增加了一倍,从而保持了相同的外观。按钮高度为14个单位看起来很有趣。你可能需要修改市场上的数据

此外,我开始将一些“Vista布局”删除为单独的样式。你可以继续沿着这条路走下去,这样你就有了一套遵循Vista指南的可重用的样式。我相当肯定其他一些人也做过类似的事情

此外,我对对话框的大小有一些随意性。你提到你想要210x96个单位-你需要设置这个数量,再加上窗户铬

不管怎样,在内容上:

  <Window x:Class="VistaLayout.Dialog"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Delete File" 
      ResizeMode="NoResize"
      Height="212" Width="430">
    <Window.Resources>
      <Style x:Key="FooterButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Width" Value="100" />
        <Setter Property="Height" Value="28" />
        <Setter Property="Margin" Value="8,0,0,0" />
      </Style>
      <Style x:Key="FooterPanelStyle" TargetType="{x:Type UniformGrid}">
        <Style.Resources>
          <Style TargetType="{x:Type Button}" BasedOn="{StaticResource FooterButtonStyle}" />
        </Style.Resources>
        <Setter Property="Rows" Value="1" />
        <Setter Property="HorizontalAlignment" Value="Right" />
      </Style>
    </Window.Resources>
    <DockPanel Margin="14">
      <!-- Footer -->
      <UniformGrid DockPanel.Dock="Bottom" 
                       Style="{StaticResource FooterPanelStyle}">
        <Button>_Yes</Button>
        <Button>_No</Button>
      </UniformGrid>

      <!-- Main Content -->
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="8" />
          <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Image Width="64" />

        <StackPanel Grid.Column="2">
          <TextBlock Margin="0,6,0,14">Are you sure you want to move this file to the Recycle Bin?</TextBlock>

          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="14" />
              <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <Image Width="60" />

            <StackPanel Grid.Column="2">
              <TextBlock>117__6.jpg</TextBlock>
              <TextBlock>Type: ACDSee JPG Image</TextBlock>
              <TextBlock>Rating: Unrated</TextBlock>
              <TextBlock>Dimensions: 1072 × 712</TextBlock>
            </StackPanel>

          </Grid>

        </StackPanel>

      </Grid>

    </DockPanel>
  </Window>

_对
_没有
是否确实要将此文件移动到回收站?
117__6.jpg
类型:ACDSee JPG图像
评级:未评级
尺寸:1072×712
与大多数XAML一样,这可以通过多种方式实现——这只是一种解决方案


希望这有帮助

Canvas layout元素允许基于坐标的布局,与您习惯的布局类似,如果您有画布,甚至可以在可视化编辑器中获得一些指导。例如:

<Window xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:d='http://schemas.microsoft.com/expression/blend/2008' mc:Ignorable='d' Title='Spin-Echo Image Processing' Width='673' x:Class='ImageR2.CLASPmap' Height='961' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
    <Canvas Name='canvas1'>
        <TextBlock Name='TEXT_Program' Canvas.Top='27' Width='133' Height='21' Canvas.Left='875'>CLASPmap:</TextBlock>
        <TextBlock Name='TEXT_Heading' Canvas.Top='27' Width='368' Height='27' Canvas.Left='1008'>Transverse Relaxation Rate Mapping</TextBlock>
        <TextBlock Name='TEXT_XYCoordinates' Canvas.Top='251' Width='139' Height='21' Canvas.Left='869'>X &amp; Y Coordinates</TextBlock>

地图:
横向弛豫速率映射
X&;Y坐标

这是我在MSDN上找到的关于的更详细的链接。WPF DIU定义为1/96英寸,DLU到像素的转换取决于字体,如下表所示


因此,将此信息与系统DPI设置一起使用,并根据目标字体,您可以计算出与给定测量值相关的DUI数量(以垂直或水平DLU为单位)。我还没有见过任何基于javascript的计算器,但是用任何编程语言创建一个类似的工具来简化这一过程是非常简单的。

我知道这是非常古老的,但我想我会尝试按照OP的要求去做。因此,这是我的尝试。顺便说一句,在我继续之前,我应该指出,由于某种原因,在使用DLU时,OPs的测量结果不太理想,但我认为我已经相当接近了。另外,请记住,我仍然是一个相对n00b当谈到这件事。。。所以如果我做了错事或亵渎神明。。。抱歉

首先,我必须找到一种方法来获得给定字体的给定字母的宽度和高度(在我的例子中,SegoeUI为10px)。。。为此,我使用了这个答案:我创建了一个静态类来保存结果的双精度:

公共静态类字体
{
公共静态双水平乘法器;
公共静态双垂直乘法器;
静态字体()
{
var formattedText=新的formattedText(
“A”,
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
新字体(“Segoe UI”),
12.0,
刷子(黑色);
Fonts.HorizontalDluMultiplier=格式化文本.Width/4;
Fonts.VerticalDluMultiplier=格式化文本.Height/8;
}
}
一旦有了这些指标,我就必须创建一个WPF转换器,它接受给定的ConverterParameter(在本例中是DLU中的一个数字),并输出两倍的像素。这是我用的转换器

public class HorizontalDluToPixelConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.Cult
<Window xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:d='http://schemas.microsoft.com/expression/blend/2008' mc:Ignorable='d' Title='Spin-Echo Image Processing' Width='673' x:Class='ImageR2.CLASPmap' Height='961' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
    <Canvas Name='canvas1'>
        <TextBlock Name='TEXT_Program' Canvas.Top='27' Width='133' Height='21' Canvas.Left='875'>CLASPmap:</TextBlock>
        <TextBlock Name='TEXT_Heading' Canvas.Top='27' Width='368' Height='27' Canvas.Left='1008'>Transverse Relaxation Rate Mapping</TextBlock>
        <TextBlock Name='TEXT_XYCoordinates' Canvas.Top='251' Width='139' Height='21' Canvas.Left='869'>X &amp; Y Coordinates</TextBlock>