我目前正在使用PanelWPF中的s,我注意到关于Width和Height属性,还有另外两个属性叫做ActualWidth和ActualHeight.
ActualWidth获取此元素的呈现宽度.这是一个依赖属性.(继承自FrameworkElement.)
Width获取或设置元素的宽度.这是一个依赖属性.(继承自FrameworkElement.)
参考:MSDN
任何人都可以指出两者之间的差异以及何时使用其中任何一个?
我有一个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(高度相同).我不知道如何获取这些信息.有帮助吗?
观察:
Canvas/Grid占据整个窗口空间,因此其中的每个矩形都有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) 我想将控件的只读属性绑定到我的视图模型,以便该值在视图模型中可用.
这样做的最佳方式是什么?
例如,我想绑定ActualWidth到视图模型中的属性.宽度值由WPF使用其布局逻辑生成,因此我无法在视图模型中生成此值并将其推送到控件属性,这通常是这种情况.相反,我需要让WPF生成值并将其推送到视图模型.
我会使用Mode=OneWayToSource,但这不适用于只读属性:
<Border
...
ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}"
>
... child controls ...
</Border>
Run Code Online (Sandbox Code Playgroud)
我目前的做法是处理SizeChanged边框,代码隐藏将值插入视图模型,但这感觉不太对.
有人已经解决了这个问题吗?
更新:我的问题实际上是这个问题的重复:将 只读GUI属性推回到ViewModel
我试图将一个Popup元素放在相对于Placement控件的特定位置.
为了实现这一点,我需要找出ActualWidth弹出控件.但是在显示弹出窗口之前或之后尝试获取此值(IsOpen = True)它总是返回0.
不幸的是,我不能硬编码弹出窗口的大小.
我怎样才能确定ActualWidth?
考虑以下:
假设Window是1024x768并且ViewBox填充整个窗口,这意味着TextBox在屏幕上非常大.
我想获得当前在屏幕上的TextBox的大小.如果我得到DesiredSize或ActualSize甚至是RenderedSize,我总是得到100.
有什么建议?
更新:我可能会得到ActualWidthViewBox并将其除以它ActualWidth的子项,这会给我当前的比例因子并以某种方式将其作为属性公开,但我不确定这是最好的方法.
我在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) 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参加Loaded或SizeChanged举办活动?
我在一个窗口中有一个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路径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,因为Actualwidth它ActualHeight从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) actualwidth ×10
wpf ×7
actualheight ×3
xaml ×3
c# ×2
silverlight ×2
size ×2
width ×2
grid ×1
inkcanvas ×1
mvvm ×1
popup ×1
selection ×1
viewbox ×1
windows-8 ×1
winrt-xaml ×1