WPF:如何在资源xaml文件中声明的代码中获取控件的实例

时间:2015-07-21 16:45:54

标签: c# wpf xaml

我正在使用资源在几个xaml文件中拆分GUI。对于工具栏,我有一个xaml文件(Resources / MainWindowToolbar.xaml):

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Resources="http://cansniff.com/resources">
    <ToolBar DataContext="{StaticResource MainWindowViewModel}" x:Key="MainWindowToolbar" 
          Background="Transparent"
          VerticalAlignment="Center"
          DockPanel.Dock="Left"
          HorizontalAlignment="Left"
          Margin="8,0,0,0">
        <Grid HorizontalAlignment="Left" Height="32" Margin="10,0,-2,-1" VerticalAlignment="Top" Width="356">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="170*"/>
                <ColumnDefinition Width="173*"/>
            </Grid.ColumnDefinitions>
            <Label Content="Device:" HorizontalAlignment="Left" VerticalAlignment="Top" RenderTransformOrigin="0.521,-0.346"/>
            <ComboBox x:Name="cboxDevices" HorizontalAlignment="Left" Margin="53,4,0,0" VerticalAlignment="Top" Width="167" Grid.ColumnSpan="2"/>
            <Button x:Name="btnConnect" Content="Connect" HorizontalAlignment="Right" Margin="0,4,0,0" VerticalAlignment="Top" Width="68" Grid.Column="1" Command="{Binding ConnectDeviceCommand}"/>
            <Button x:Name="btnRefresh" Content="Refresh" Grid.Column="1" HorizontalAlignment="Left" Margin="49,4,0,0" VerticalAlignment="Top" Width="58" Command="{Binding RefreshDevicesCommand}"/>
        </Grid>
    </ToolBar>
</ResourceDictionary>

然后在我的窗口(MainWindow.xaml)中我只是合并资源:

 <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/MainWindowMenus.xaml" />
                <ResourceDictionary Source="Resources/MainWindowToolbar.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

如何在代码中获取控件实例(MainWindow.xaml.cs)?

1 个答案:

答案 0 :(得分:2)

我要回答你的问题,然后我会告诉你为什么它不起作用:P

要获取已声明为资源的对象,请按以下步骤操作:

ToolBar toolBar = FindResource("MainWindowToolbar") as ToolBar;

但是......这可能不适用于你想要做的事情。 Control的实例只能有一个可视父级。在大多数情况下,尝试将该实例重用于多个视图会抛出异常,或导致奇怪的行为。

执行此操作的正确方法是使用UserControls或样式和模板。最简单的方法是在你的ToolBar里面创建一个UserControl,然后将UserControl添加到你希望它拥有它的每个视图中。