【问题标题】:Accessing named controls from page resources从页面资源访问命名控件
【发布时间】:2012-11-21 21:32:15
【问题描述】:

我需要访问没有指定宽度的边框的实际宽度。有人告诉我,我不能在 WinRT 上这样做,所以我使用了 Florian-Gl 的代理(来自 here)。

问题是我需要像这样在页面资源上创建该代理:

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

问题是我无法从资源中访问该 noteBorder 元素,但我可以访问页面本身的 pageRoot

我想我可以使用 ElementName / Path 来访问 noteBorder。

但是有一些奇怪的东西:

结构类似于:

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

所以,如果我在边框的同一级别创建代理,它不会运行,但如果我将 ListView 更改为 ItemsControl,它将按预期运行和工作。

如果它位于边框的同一级别,我将 ElementName 更改为 pageRoot 它至少会运行。

所以,如果我使用 ListView,如果我放置 noteBorder(即使我可以访问它),它也不会运行,但会在 ItemsControl 上工作,另一方面,如果我有 pageRoot 它适用于所有方式。

所以问题是:有没有办法从资源中访问noteBorder?或者也许是一种从另一个地方访问它但工作的方法:P

【问题讨论】:

    标签: windows-runtime winrt-xaml


    【解决方案1】:

    您应该使用项目模板 -- 当你到达 pageRoot) > Grid > ListView 或 Items Control

    在结构中的这一点上,您位于您真正想要访问的元素处,它是需要您尝试访问的边框的项目的容器。

    您应该定义一个项目模板并通过绑定分配 ListView(或 ItemsControl)的 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>
    

    然后在您的 Codebehind 中(或者如果 ViewModel 使用后面的代码将 ListView 对象传递给 ViewModel)

    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

    【讨论】:

    • 感谢您的宝贵时间。但这不是我要问的。我需要访问资源部分中的控件。我知道我可以通过代码选择 ActualWidth,但我更喜欢在 XAML 上这样做,这就是我问这个的原因。我的边框在 ItemTemplate 内。
    • 好的,一旦你有了实际宽度,你想做什么?根据边框的大小修改其他一些元素?修改边框元素本身?来自 MSDN:虽然您无法从 XAML 设置此属性,但您可以将触发器基于其样式中的值。有关触发器的更多信息:msdn.microsoft.com/en-us/library/system.windows.trigger.aspx
    • 忘记 ActualWidth 的东西,只是想知道我是否可以从资源中访问控件,仅此而已。
    • 是的,如果您正在访问的控件绑定到模板,您可以从资源文件访问控件的属性。这样,您可以通过访问模板的属性来访问控件的属性。您可以通过资源文件修改 RunTime UI 元素吗?是的,在列表项的模板上使用可视状态管理器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2010-12-23
    • 2017-02-04
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多