我里面有以下代碼MainPage.xaml:
<Page ...>
<VariableSizedWrapGrid Name="ContentGrid"/>
</Page>
只是一個原始標記,用于創建將包含一些 CalendarView 實體的網格控制元件。\
然后在MainPage.xaml.cs我生成幾個日歷:
namespace App1 {
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
for (int i = 1; i <= 12; i )
{
CalendarView instance = new CalendarView();
instance.CalendarViewDayItemChanging = myEvent;
ContentGrid.Children.Add(instance);
}
}
private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args){...}
}
}
但是,這些日歷具有覆寫樣式的內部內容,該樣式定義在 App.xaml
<Application ...>
<Application.Resources>
<ResourceDictionary>
<Style x:Key="CalendarViewDayItemRevealStyle" TargetType="CalendarViewDayItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CalendarViewDayItem">
<Grid x:Name="itemgrid" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="CalendarViewDayItem" BasedOn="{StaticResource CalendarViewDayItemRevealStyle}" />
</ResourceDictionary>
</Application.Resources>
</Application>
每個日歷控制元件實體包含多個 CalendarViewDayItem 控制元件。這些 CalendarViewDayItem 控制元件中的每一個都將使用上面的模板呈現其內容。
問題是:如何訪問實體特定的網格元素(此處使用名稱 itemgrid)?
在理想的世界中,我會想象這樣的事情:
private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args){
CalendarViewDayItem instance = args.Item;
ControlTemplate instance_template = instance.Template;
Grid g = (Grid)instance_template.getValue().getElementByName("itemgrid");
}
我也知道只有當實體被充分構造時,這種訪問才應該起作用。此外,也許一些針對每個實體的系結巫術可能會起作用。這是與如何從代碼隱藏中訪問控制元件模板的元素類似的問題, 但我們在這里使用 UWP。
uj5u.com熱心網友回復:
試試這個:
private void Instance_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
CalendarViewDayItem item = args.Item;
Grid grid = FindMyChildByName(item, "itemgrid") as Grid;
}
public static DependencyObject FindMyChildByName(DependencyObject parant, string ControlName)
{
int count = VisualTreeHelper.GetChildrenCount(parant);
for (int i = 0; i < count; i )
{
var MyChild = VisualTreeHelper.GetChild(parant, i);
if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
return MyChild;
var FindResult = FindMyChildByName(MyChild, ControlName);
if (FindResult != null)
return FindResult;
}
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/378605.html
