在我的应用程序中,我们有一个视图模型对象,我们使用自定义函数FrameworkElement
从中检索其附加的GetVisualChildWithDataContext
(见下文)。
发生的事情是这个函数返回一个ContentPresenter
对象,其ActualWidth
和ActualHeight
属性为0.我希望自从我获得2个属性的值为24内容由24x24矩形组成。
我的问题是,如何通过仅拥有视图模型来检索我期望的值(ActualWidth
和ActualHeight
的24)?如果有更好的方法,我会全力以赴。
感谢您的时间。 (见下面的示例)
XAML:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication2"
Title="MainWindow"
Width="525"
Height="350">
<Canvas x:Name="_RootCanvas">
<ItemsControl Margin="-5,0,0,0" ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type l:MyItem}">
<Canvas>
<Rectangle
Canvas.Left="{Binding ActualLeft}"
IsHitTestVisible="True"
Margin="0,0,0,0"
Width="24"
Height="24"
Fill="Black" />
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Canvas.Top="50" Width="100" Height="30" Click="Button_Clicked">
<TextBlock Text="Button" />
</Button>
</Canvas>
</Window>
代码背后:
private MyItem _MyItem;
public MainWindow()
{
InitializeComponent();
_MyItem = new MyItem(0);
MyItems = new ObservableCollection<MyItem>();
MyItems.Add(_MyItem);
DataContext = this;
}
public ObservableCollection<MyItem> MyItems { get; set; }
public void Button_Clicked(object sender, RoutedEventArgs e)
{
FrameworkElement fe = GetVisualChildWithDataContext(_RootCanvas, _MyItem);
}
public static FrameworkElement GetVisualChildWithDataContext(DependencyObject parent, object dataContext)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
DependencyObject d = VisualTreeHelper.GetChild(parent, i);
FrameworkElement element = d as FrameworkElement;
if (element != null)
{
if (element.DataContext == dataContext)
return element;
var f = GetVisualChildWithDataContext(element, dataContext);
if (f != null)
return f;
}
}
return null;
}
public class MyItem
{
public MyItem(double left)
{
ActualLeft = left;
}
public double ActualLeft { get; set; }
}
答案 0 :(得分:0)
我已使用此链接中描述的技术绑定到ActualWidth
和ActualHeight
:
http://meleak.wordpress.com/2011/08/28/onewaytosource-binding-for-readonly-dependency-property/
作者将他的技术称为“推送绑定”。
答案 1 :(得分:0)
要解决我的问题,我创建了以下扩展方法:
public static Size GetActualSize(this FrameworkElement parent)
{
var contentPresenter = parent as ContentPresenter;
if (contentPresenter != null)
{
Rect descendantBounds = VisualTreeHelper.GetDescendantBounds(contentPresenter);
if (!descendantBounds.Size.IsEmpty)
return descendantBounds.Size;
}
return new Size(parent.ActualWidth, parent.ActualHeight);
}
不漂亮,但它完成了工作。