标签: actualwidth

WPF中的Width和ActualWidth有什么区别?

我目前正在使用PanelWPF中的s,我注意到关于WidthHeight属性,还有另外两个属性叫做ActualWidthActualHeight.

ActualWidth

获取此元素的呈现宽度.这是一个依赖属性.(继承自FrameworkElement.)

Width

获取或设置元素的宽度.这是一个依赖属性.(继承自FrameworkElement.)

参考:MSDN

任何人都可以指出两者之间的差异以及何时使用其中任何一个?

size wpf width actualwidth

47
推荐指数
3
解决办法
5万
查看次数

为什么在这种情况下ActualWidth和ActualHeight为0.0?

我有一个Grid内部Canvas定义如下:

<Canvas x:Name="outerCanvas">
    <Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition  />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" />
        <Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" />
        <Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" />
        <Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" />
    </Grid>
</Canvas>
Run Code Online (Sandbox Code Playgroud)

我的问题是,在窗口的构造,后InitializeComponents()两种Grid.ColumnDefinitions[0].ActualWidth或"任何矩形".ActualWidth都被设置为0.0(高度相同).我不知道如何获取这些信息.有帮助吗?

观察:

  1. 我没有定义外部画布的宽度和高度,但如果我这样做,它并不能解决我的问题.
  2. 在运行时我可以看到它Canvas/Grid占据整个窗口空间,因此其中的每个矩形都有ActualWidth …

wpf grid xaml actualwidth actualheight

43
推荐指数
2
解决办法
6万
查看次数

绑定到ActualWidth不起作用

在Silverlight 3.0应用程序中,我试图在画布中创建一个矩形,并使其拉伸画布的整个宽度.我试图通过绑定到ActualWidth父容器的属性(下面的示例)来做到这一点,但是当我没有看到任何绑定错误时,该值没有被绑定.矩形不可见,因为其宽度为零.另外尝试绑定到ActualWidth包含我的矩形的画布,但这没有区别.

我确实发现Microsoft Connect上记录了此错误,但没有列出变通方法.

有没有人能够解决这个问题,还是他们可以指出解决方案?

编辑:原始代码示例不准确我想要实现的目标,更新更清晰.

<UserControl>
    <Border BorderBrush="White"
            BorderThickness="1"
            CornerRadius="4"
            HorizontalAlignment="Center">
        <Grid x:Name="GridContainer">
            <Rectangle Fill="Aqua"
                       Width="150"
                       Height="400" />
            <Canvas>
                <Rectangle Width="{Binding Path=ActualWidth, ElementName=GridContainer}"
                           Height="30"
                           Fill="Red" />
            </Canvas>

            <StackPanel>
                <!-- other elements here -->
            </StackPanel>
        </Grid>
    </Border>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

silverlight actualwidth

24
推荐指数
4
解决办法
2万
查看次数

如何绑定只读WPF控件属性(例如ActualWidth),以便在视图模型中访问其值?

我想将控件的只读属性绑定到我的视图模型,以便该值在视图模型中可用.

这样做的最佳方式是什么?

例如,我想绑定ActualWidth到视图模型中的属性.宽度值由WPF使用其布局逻辑生成,因此我无法在视图模型中生成此值并将其推送到控件属性,这通常是这种情况.相反,我需要让WPF生成值并将其推送到视图模型.

我会使用Mode=OneWayToSource,但这不适用于只读属性:

  <Border
      ...
      ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}"
      >
      ... child controls ...
  </Border>
Run Code Online (Sandbox Code Playgroud)

我目前的做法是处理SizeChanged边框,代码隐藏将值插入视图模型,但这感觉不太对.

有人已经解决了这个问题吗?

更新:我的问题实际上是这个问题的重复:将 只读GUI属性推回到ViewModel

c# wpf xaml mvvm actualwidth

23
推荐指数
1
解决办法
4万
查看次数

如何获取WPF弹出窗口的ActualWidth

我试图将一个Popup元素放在相对于Placement控件的特定位置.

为了实现这一点,我需要找出ActualWidth弹出控件.但是在显示弹出窗口之前或之后尝试获取此值(IsOpen = True)它总是返回0.

不幸的是,我不能硬编码弹出窗口的大小.

我怎样才能确定ActualWidth

wpf popup actualwidth wpf-positioning

12
推荐指数
1
解决办法
1513
查看次数

获取ViewBox中项目的大小(在"拉伸"之后)

考虑以下:

假设Window是1024x768并且ViewBox填充整个窗口,这意味着TextBox在屏幕上非常大.

我想获得当前在屏幕上的TextBox的大小.如果我得到DesiredSize或ActualSize甚至是RenderedSize,我总是得到100.

有什么建议?

更新:我可能会得到ActualWidthViewBox并将其除以它ActualWidth的子项,这会给我当前的比例因子并以某种方式将其作为属性公开,但我不确定这是最好的方法.

size wpf viewbox actualwidth

10
推荐指数
1
解决办法
3490
查看次数

如何强制ActualWidth和ActualHeight更新(silverlight)

我在silverlight控件上有一个网格,我以编程方式添加了一个画布,在画布中我正在加载并显示Image.

我还在画布上添加一个旋转.问题是默认情况下,旋转的CenterX和CenterY是画布的左上角.我想要的是围绕画布中心的旋转.

为此,我尝试将旋转的CenterX和CenterY设置为Images ActualWidth/ 2和ActualHeight/ 2,但是我发现ActualWidth并且ActualHeight并不总是填充,至少不会立即填充.我如何强迫他们更新?

即使在图像上使用DownloadProgress事件似乎也不能保证填充ActualWidth和ActualHeight,也没有使用this.Dispatcher.BeginInvoke()...

Image imgTest = new Image();
Canvas cnvTest = new Canvas();
Uri uriImage = new Uri("myurl", UriKind.RelativeOrAbsolute);
System.Windows.Media.Imaging.BitmapImage bmpDisplay = new System.Windows.Media.Imaging.BitmapImage(uriImage);

bmpDisplay.DownloadProgress += new EventHandler<System.Windows.Media.Imaging.DownloadProgressEventArgs>(this.GetActualDimensionsAfterDownload);

imgTest.Source = bmpDisplay;
imgTest.Stretch = Stretch.Uniform;
imgTest.HorizontalAlignment = HorizontalAlignment.Center;
imgTest.VerticalAlignment = VerticalAlignment.Center;

cnvTest.Children.Add(imgTest);

this.grdLayout.Children.Add(imgTest);
this.Dispatcher.BeginInvoke(new Action(GetActualDimensions)); 
Run Code Online (Sandbox Code Playgroud)

silverlight actualwidth actualheight

9
推荐指数
1
解决办法
7643
查看次数

如果我从代码创建文本块,如何计算加载时的textbock高度和宽度?

TextBlock tbl= new TextBlock();
tbl.text="Kishore";

double x=tbl.ActualHeight;
double y=tbl.ActualWidth;
Run Code Online (Sandbox Code Playgroud)

如果我从Metro中加载的事件执行代码 - winRT将为两者返回0.

我怎样才能ActualWidth参加LoadedSizeChanged举办活动?

c# windows-8 windows-runtime winrt-xaml actualwidth

9
推荐指数
1
解决办法
4685
查看次数

如何根据XAML中的窗口或屏幕大小设置网格列MaxWidth

我在一个窗口中有一个3列网格,第一列上有一个GridSplitter.我想将第一列的MaxWidth设置为父窗口或页面Width(或ActualWidth)的三分之一,如果可能,我更愿意在XAML中执行此操作.

这是在XamlPad(或类似)中使用的一些示例XAML,它显示了我正在做的事情.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="Column1" Width="200"/>
            <ColumnDefinition x:Name="Column2" MinWidth="50" />
            <ColumnDefinition x:Name="Column3" Width="{ Binding ElementName=Column1, Path=Width }"/>
            </Grid.ColumnDefinitions>

        <Label Grid.Column="0" Background="Green" />
        <GridSplitter Grid.Column="0" Width="5" />
        <Label Grid.Column="1" Background="Yellow" />
        <Label Grid.Column="2" Background="Red" />
    </Grid>
</Page>
Run Code Online (Sandbox Code Playgroud)

如您所见,右列宽度与第一列的宽度绑定,因此当您使用拆分器滑动左列时,右列会执行相同的操作:)如果您将左列向右滑动,最终它会将滑过页面/窗口的一半,然后滑到窗口的右侧,推开第2列和第3列.

我想通过将第1列的MaxWidth设置为窗口宽度的三分之一(或类似的东西)来防止这种情况.我可以很容易地在代码中执行此操作,但如何在"仅限XAML"中执行此操作?

编辑: David Schmitt建议使用SharedSizeGroup而不是绑定,这是一个很好的建议.我的示例代码如下所示:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
        <Grid IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="Column1" SharedSizeGroup="ColWidth" Width="40"/>
                <ColumnDefinition x:Name="Column2" MinWidth="50" Width="*" />
                <ColumnDefinition x:Name="Column3" SharedSizeGroup="ColWidth"/>
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" Background="Green" />
            <GridSplitter Grid.Column="0" Width="5" /> …
Run Code Online (Sandbox Code Playgroud)

wpf xaml width actualwidth

7
推荐指数
1
解决办法
3万
查看次数

为什么ActualWidth和ActualHeight从0,0开始?

我想添加WPF路径InkCanvas并使用选择来选择WPF路径.所以,我使用这段代码.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;    
drawCanvas.Children.RemoveAt(i);
inkCanvas.Children.Add(path);
Run Code Online (Sandbox Code Playgroud)

这是输出.我必须从0,0中选择WPF Path,因为ActualwidthActualHeight从0,0开始.

替代文字

如何选择绝对WPF路径?

谢谢

编辑:

现在,我可以使用此代码绝对选择它.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;
drawCanvas.Children.RemoveAt(i);
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0);
containPath.Children.Add(path);
containPath.Width = getMaxX(path) - getMinX(path);
containPath.Height = getMaxY(path) - getMinY(path);
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0);
inkCanvas.Children.Add(containPath);
Run Code Online (Sandbox Code Playgroud)

wpf selection inkcanvas actualwidth actualheight

6
推荐指数
1
解决办法
2262
查看次数