2015-10-04 17 views
1

我有我的自定義控件MyControl,它具有公共方法Start()。如何在不使用x的情況下在自定義控件中使用公共方法:名稱

public partial class MyControl : UserControl 
{ 
    // This must be private. 
    private int _idNumber; 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 

    public void Start(int idNumber) 
    { 
     _idNumber = idNumber; 
    } 
} 

在MainWindow中,我將一個MyControl與x:Name =「myControl」放在一起。

<Window x:Class="MyNameSpace.MainWindow" 
     xmlns:local="clr-namespace:MyNameSpace"> 
    <Grid> 
     <local:MyControl x:Name="myControl"/> 
    </Grid> 
</Window> 

在MainWindow的Start方法中,我使用x:Name調用MyControl的Start方法。

public partial class MainWindow : Window 
{ 
    // This must be private 
    private int _myContolId; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void Start() 
    { 
     // ID must be set here. 
     _myControlId = 1; 
     myControl.Start(_myControlId); 
    } 
} 

如何在不使用x:Name的情況下做同樣的事情?

請注意,MyControl的加載事件在我的情況下是無效的,因爲MyControl的Start()方法必須在作爲可視元素加載之前調用。

由於必須在MainWindow的Start方法中設置int參數idNumber,所以在MyControl的構造函數或初始化時調用Start也是無效的。

更重要的是,MainControlow的_ControlNumber和_myContolId對於setter和getter都必須是私有的。

+1

調用在MyControl的構造函數中開始?或者在重載的OnInitialized方法中? – Clemens

+0

@Clemens感謝您的快速回復,但這是不可能的。我在我的問題的編輯版本中解釋了我真正想做的事情。 – user4134476

回答

1

Handle UserControl的初始化事件。 <local:MyControl x:Name="myControl" Initialized="myControl_Initialized"/>

您是否選擇處理加載或初始化取決於您的 要求。如果您不需要讀取元素屬性,打算重置屬性,並且不需要任何佈局信息,則初始化的 可能是更好的事件。如果您需要 的所有屬性,則該元素可用,並且您將設置 可能會重置佈局的屬性,Loaded可能是 採取行動時的更好事件。

來源:FrameworkElement.Initialized Event

你應該在代碼中創建用戶控件像下面,並將其添加:

public partial class MainWindow : Window 
{ 
// This must be private 
private int _myContolId; 

public MainWindow() 
{ 
    InitializeComponent(); 
} 

public void Start() 
{ 
    // ID must be set here. 
    _myControlId = 1; 
    MyControl myControl = new MyControl(); 
    myControl.Start(_myControlId); 

    GridContainer.Children.Add(myControl); 
} 

}

這將解決您的問題。如果您聲明元素/控件XAML,則會在解析XAML文件時創建它。

+0

謝謝你的回覆,但這是不可能的。我在我的問題的編輯版本中解釋了我真正想做的事情。 – user4134476

+0

謝謝,但在我的實際代碼中,XAML結構要複雜得多,並且在代碼隱藏中添加元素非常困難。 – user4134476

+0

使用可以使用Bridge(自定義類),從MainWindow填充它的屬性,然後處理UserControl的Initialize事件並從Bridge對象獲取這些屬性等。這個橋類可以聲明爲應用程序/窗口資源,所以它可以被MainWindow和UserControl使用。 – AnjumSKhan

相關問題