在WPF ControlTemplate中查找控件

3

我创建了一个继承自Window的类,并对其应用了控件模板:

public class BaseSearchWindow : Window {
        static BaseSearchWindow() {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(BaseSearchWindow), new FrameworkPropertyMetadata(typeof(BaseSearchWindow)));
        }
        public BaseSearchWindow() {
            Uri uri = new Uri("/WPFLibs;component/Resources/StyleResources.xaml", UriKind.Relative);
            ResourceDictionary Dict = Application.LoadComponent(uri) as ResourceDictionary;
            this.Style = Dict["WindowTemplate"] as Style;
        }

我想在控件模板中找到一些控件:

 public override void OnApplyTemplate() {

                RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand;
               //doesn't work, searchCommand is null
                searchCommand.CanExecute += CanExecuteRibbonCommand;
    }

但它始终是null。我在继承类中尝试过,它可以工作,但我想在我的基类中使用它,这样我就不必每次使用该类时都要搜索它。这样可以解决问题:

public partial class MainWindow : BaseSearchWindow {
        public MainWindow() {
            InitializeComponent();
            RibbonCommand searchCommand = this.Template.FindName("searchCommand", this) as RibbonCommand;
            searchCommand.CanExecute += CanExecuteRibbonCommand;

        }   
3个回答

1
在编程中,使用OnApplyTemplate中的FindName是正确的方法;我认为它不起作用是因为你忘记调用base.OnApplyTemplate()

我已经尝试过了,但它并没有起作用,虽然理论上应该可以。 - Vale
是的,但今天不行,我现在在家,明天一到工作岗位就会发布。 - Vale

0

我猜你正在寻找一个不存在的命令(或者有不同的名称),或者它不是一个 RibbonCommand。

要么就是你在 xaml 中没有指定 x:FieldModifier="protected" 作为该命令。


不行,因为它在扩展类中有效,正如我在问题中所述。 - Vale

0
其实我犯了一个错误。当我尝试查找不是 RibbonCommands 的控件时,它起作用了,所以现在我先查找父控件,然后使用 VisualTreeHelper 查找 RibbonCommand。对此我很抱歉,我一直认为它只适用于扩展类,但我想当我发布这个问题时已经太累了。无论如何,感谢您的帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接