2012-11-20 19 views
0

我需要訪問沒有指定寬度的邊框的ActualWidth。我被告知我無法在WinRT上這麼做,所以我使用了Florian-Gl的代理(從here)。從頁面資源訪問命名控件

的事情是,我需要建立這樣的頁面上的資源是代理:

<Page.Resources> 
    <utils:ActualSizePropertyProxy Element="{Binding ElementName=noteBorder}" x:Name="proxy" /> 
</Page.Resources> 

的問題是,我沒有訪問來自資源noteBorder元素,但我有機會到pageRoot這是頁面本身。

我想我可以玩元素名/路徑來訪問noteBorder。

但是有一些奇怪的東西:

的結構是這樣的:

Page (pageRoot) > Grid > ListView > ListView.ItemTemplate > Grid > Border (noteBorder) 

所以,如果我創建在邊境同級別的代理,它不會運行,但如果我將ListView更改爲ItemsControl,它將運行並按預期工作。

如果在邊界的同一水平上具有它,我改變的ElementNamepageRoot它至少會運行。

所以,如果我把noteBorder(甚至當我有機會的話),如果我用一個ListView它不會運行,但將努力在ItemsControl中,在另一方面,如果我有pageRoot它可以通用。

所以問題是:有沒有辦法從資源訪問noteBorder?或者,也許一個方法,從另一個地方,但工作訪問:P

回答

0

您應該使用項模板 - 到時候你到 pageRoot)>網格> ListView控件或項控件

在這點在結構中,你在你真正想要的元素,這是需要你想要訪問的邊框的項目的容器。

您應該定義一個Item Template並通過綁定來分配ListView的(或ItemsControl's)ItemTemplate屬性。

<ListView x:Name="myListView" DataContext="{Binding ToElementIfNotInheritedFromParent}" ItemsSource="{Binding ViewModelListBeingBoundTo}" ItemTemplate="{Binding Source={Static Resource MyCustomItemTemplate}}" /> 

哪裏MyCustomItemTemplate是一樣的東西

<DataTemplate x:Name="MyCustomItemTemplate"> 
    <Border x:Name="myBorder" > 
    <StackPanel> 
     <TextBlock Text="{Binding Path=Title}" /> 
     <TextBlock Text="{Binding Path=FirstProperty}"/> 
     <TextBlock Text="{Binding Path=SecondProperty}"/> 
    </StackPanel> 
    </Border> 
</DataTemplate> 

然後在你的代碼隱藏(或如果視圖模型使用的代碼隱藏到ListView對象傳遞給視圖模型)

DataTemplate dt = this.myListView.Items[indexOfChoice].ItemTemplate as DataTemplate; 
Border b = dt.LoadContent() as Border; 
int actualWidth = b.AcutalWidth 

OR 

You can create a FindControl() method that runs recursively to extract the actual control within the border, for instance if you wanted to access one of the Textboxes. 

的代碼即: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a612f5a6-e05e-4b68-a813-893eeda159cc

+0

謝謝你的提問即但這不是我要求的。我需要訪問資源部分的控件。我知道我可以通過代碼選擇ActualWidth,但我更喜歡在XAML上這樣做,這就是爲什麼我要這樣做。我的邊框位於ItemTemplate中。 –

+0

好吧,所以一旦你有實際的寬度,你想要做什麼?根據邊框的大小修改其他元素?修改邊框元素本身? 來自MSDN:雖然您不能從XAML設置此屬性,但您可以將觸發器基於其樣式中的值。 有關觸發器的更多信息:http://msdn.microsoft.com/en-us/library/system.windows.trigger.aspx –

+0

忘記ActualWidth的東西,只是要知道如果我可以從資源訪問控件,只是。 –