[c#] كيف يمكنني الوصول إلى عنصر تحكم داخل XAML DataTemplate؟



Answers

ربما يكون نهج أكثر عمومية بعض الشيء مثل هذا:

private List<Control> AllChildren(DependencyObject parent)
{
    var _List = new List<Control>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
       var _Child = VisualTreeHelper.GetChild(parent, i);
       if (_Child is Control)
       {
        _List.Add(_Child as Control);
       }
      _List.AddRange(AllChildren(_Child));
    }
    return _List;
 } 


private T FindControl<T> (DependencyObject parentContainer, string controlName)
{            
        var childControls = AllChildren(parentContainer);
        var control = childControls.OfType<Control>().Where(x => x.Name.Equals(controlName)).Cast<T>().First();           
        return control;
}

يمكنك استدعاء FindControl مثل هذا:

var parentContainer = this.flipView.ItemContainerGenerator.ContainerFromItem(this.flipView.SelectedItem);
var myImage = FindControl<Image>(parentContainer, "img1");

//suppose you want to change the visibility
myImage.Visibility = Windows.UI.Xaml.Visibility.Collapsed;         
Question

لدي هذا العرض:

<FlipView x:Name="models_list" SelectionChanged="selectionChanged">
 <FlipView.ItemTemplate>
          <DataTemplate>
                <Grid x:Name="cv">
                        <Image x:Name="img1" Source = "{Binding ModelImage}" Stretch="Fill" Tag="{Binding ModelTag}"/>
                </Grid>
           </DataTemplate>
  </FlipView.ItemTemplate>

أرغب في العثور على img1 للفهرس المحدد حاليًا. أثناء البحث عني وجدت هذه الطريقة في بعض المنشور هنا:

private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
    {
        int childNumber = VisualTreeHelper.GetChildrenCount(control);
        for (int i = 0; i < childNumber; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(control, i);
            FrameworkElement fe = child as FrameworkElement;
            // Not a framework element or is null
            if (fe == null) return null;

            if (child is T && fe.Name== ctrlName)
            {
                // Found the control so return
                return child;
            }
            else
            {
                // Not found it - search children
                DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
                if (nextLevel != null)
                    return nextLevel;
            }
        }
        return null;
    }

يعيدني الصورة على الفهرس الأول للفليفيو لكني أحتاج إلى واحد موجود على المؤشر المختار حاليًا .. حاولت تحرير هذه الطريقة لكني غير قادر على إيجاد السيطرة المطلوبة. هل يستطيع أي أحد مساعدتي؟




لذلك إذا قمت بتعيين المصدر عبر الربط لما لا تفعل نفس الشيء مع بقية: <FlipView SelectedIndex="{Binding SIndex}" SelectedItem="{Binding SItem}" SelectedValue="{Binding SValue}"/>

يجب عليك أولا إعداد مكان لهذه الخصائص. قد يكون فئة مشتقة من INotifyPropertyChanged .

استأجر MVVM للعمل معك ، قم بأداء معظم المهام في XAML. وبالطبع في البداية ، يبدو أنه عمل أكثر ولكن مع مشروع أكثر تطورا مع MVVM سيكون متماسكا ومرنا.




إذا كنت ترغب فقط في إحداثيات الشاشة على عنصر انقر فوق ... يمكنك تسجيل معالج النقر على الصورة ثم استخدم senderimg.transform tovisual (خالية) هذا يمنحك generaltransforn من الذي يمكنك الحصول على إحداثيات نقطة الحالية.




Related