【问题标题】:How to implement button handlers when using UserControls?使用 UserControls 时如何实现按钮处理程序?
【发布时间】:2015-07-15 14:37:47
【问题描述】:

我正在设计一个应用程序,其中我将有一个模板化的 UI 格式,它将根据从数据库返回的对象数 (

我在窗口的 xaml 中添加了一个临时的 Test TabItem,分配了资源,但我无法修改窗口中的任何项目。

我应该使用 UserControls 以外的东西吗?这些选项卡将具有完全相同的功能,只是需要通过选项卡浏览的不同数据集。但数据类型将完全相同。

编辑 3:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:<Redacted>.WPF"
    xmlns:ToggleSwitch="clr-namespace:ToggleSwitch;assembly=ToggleSwitch" x:Class="<Redacted>.WPF.MainWindow"
    mc:Ignorable="d"
    Title="<Redacted>" Height="704" Width="1203.3">
<Window.Resources>
    <UserControl x:Key="RemoteSiteUserControl">
        <Grid Background="#FFE5E5E5">
            <Grid.RowDefinitions>
                <RowDefinition Height="334*"/>
                <RowDefinition Height="257*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10*"/>
                <ColumnDefinition Width="31*"/>
            </Grid.ColumnDefinitions>
            <ListView x:Name="listViewMachines" HorizontalAlignment="Left" Height="252" Margin="10,34,0,0" VerticalAlignment="Top" Width="261">
                <ListView.View>
                    <GridView>
                        <GridViewColumn/>
                    </GridView>
                </ListView.View>
            </ListView>
            <Label x:Name="lblMachines" Content="Machines:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="122"/>
            <Label x:Name="lblNotifications" Content="Notification Queue:" Grid.Column="1" HorizontalAlignment="Left" Height="32" Margin="10,55,0,0" Grid.Row="1" VerticalAlignment="Top" Width="167"/>
            <ListView x:Name="listViewNotifications" Grid.Column="1" HorizontalAlignment="Left" Height="160" Margin="23,87,0,0" Grid.Row="1" VerticalAlignment="Top" Width="855">
                <ListView.View>
                    <GridView>
                        <GridViewColumn/>
                    </GridView>
                </ListView.View>
            </ListView>
            <Button x:Name="btnAddMachine" Content="Add" HorizontalAlignment="Left" Margin="10,300,0,0" VerticalAlignment="Top" Width="75" Click="btnAddMachine_Click"/>
            <Button x:Name="btnModifyMachine" Content="Modify" HorizontalAlignment="Left" Margin="104,300,0,0" VerticalAlignment="Top" Width="75" Click="btnModifyMachine_Click"/>
            <Button x:Name="btnDelete" Content="Delete" HorizontalAlignment="Left" Margin="196,300,0,0" VerticalAlignment="Top" Width="75" Click="btnDelete_Click"/>
            <Label x:Name="lblIpAddress" Content="Ip Address:" HorizontalAlignment="Left" Height="23" Margin="49,81,0,0" VerticalAlignment="Top" Width="62" FontSize="10.667" RenderTransformOrigin="0.784,0.435" Grid.Row="1"/>
            <Label x:Name="lblMachineName" Content="Machine Name:" HorizontalAlignment="Left" Height="23" Margin="28,25,0,0" VerticalAlignment="Top" Width="83" FontSize="10.667" RenderTransformOrigin="0.602,0.565" Grid.Row="1"/>
            <Label x:Name="lblAlias" Content="Alias:" HorizontalAlignment="Left" Height="23" Margin="77,53,0,0" VerticalAlignment="Top" Width="34" FontSize="10.667" Grid.Row="1"/>
            <TextBox x:Name="txtMachineName" HorizontalAlignment="Left" Height="23" Margin="116,25,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="136" FontSize="10.667" FontFamily="Arial" Grid.Row="1" IsReadOnly="True" IsReadOnlyCaretVisible="True"/>
            <TextBox x:Name="txtIpAddress" HorizontalAlignment="Left" Height="23" Margin="116,81,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="136" Grid.Row="1" IsReadOnly="True" IsReadOnlyCaretVisible="True"/>
            <TextBox x:Name="txtAlias" HorizontalAlignment="Left" Height="23" Margin="116,53,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="136" FontSize="10.667" FontFamily="Arial" Grid.Row="1" IsReadOnly="True" IsReadOnlyCaretVisible="True"/>
            <Label x:Name="lblStatus" Content="Status:" Grid.Column="1" HorizontalAlignment="Left" Margin="23,32,0,0" VerticalAlignment="Top" Width="53" FontSize="14.667"/>
            <Ellipse Name="ellipseStatus" Grid.Column="1" Fill="Red" HorizontalAlignment="Left" Height="18" Margin="100,37,0,0" Stroke="Black" VerticalAlignment="Top" Width="18"/>
            <Label x:Name="lblPerfCounters" Content="Performance Counters:" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="532,23,0,0" VerticalAlignment="Top" Width="161" FontSize="14.667"/>
            <ToggleSwitch:HorizontalToggleSwitch Name="togglePerfCounters" Grid.Column="1" HorizontalAlignment="Left" Margin="747,31,0,0" VerticalAlignment="Top" Height="19" Width="76"/>
            <Label x:Name="lvlServices" Content="Services:" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="23,84,0,0" VerticalAlignment="Top" Width="74" FontSize="14.667"/>
            <ListView x:Name="listViewServices" Grid.Column="1" HorizontalAlignment="Left" Height="229" Margin="23,114,0,0" VerticalAlignment="Top" Width="409" Grid.RowSpan="2">
                <ListView.View>
                    <GridView>
                        <GridViewColumn/>
                    </GridView>
                </ListView.View>
            </ListView>
            <Button x:Name="btnDeleteServiceMonitor" Content="Delete" HorizontalAlignment="Left" Margin="357,22,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Grid.Row="1" Click="btnDeleteServiceMonitor_Click"/>
            <Button x:Name="btnAddServiceMonitor" Content="Add" HorizontalAlignment="Left" Margin="266,22,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Grid.Row="1" Click="btnAddServiceMonitor_Click"/>
            <TextBox x:Name="txtCpuTimer" HorizontalAlignment="Left" Height="30" Margin="687,73,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="136" FontSize="10.667" FontFamily="Arial" IsReadOnly="True" IsReadOnlyCaretVisible="True" Grid.Column="1"/>
            <Label x:Name="lblCpuTimer" Content="Cpu Timer(sec):" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="588,73,0,0" VerticalAlignment="Top" Width="94"/>
            <Label x:Name="lblCpuUsage" Content="Cpu Usage(%):" Grid.Column="1" HorizontalAlignment="Left" Height="30" Margin="593,114,0,0" VerticalAlignment="Top" Width="94" RenderTransformOrigin="0.734,0.4"/>
            <TextBox x:Name="txtCpuUsage" HorizontalAlignment="Left" Height="30" Margin="687,114,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="136" FontSize="10.667" FontFamily="Arial" IsReadOnly="True" IsReadOnlyCaretVisible="True" Grid.Column="1"/>
            <Label x:Name="lblCpuPerformance" Content="CPU Performance:" Grid.Column="1" HorizontalAlignment="Left" Height="33" Margin="543,200,0,0" VerticalAlignment="Top" Width="144" FontSize="14.667"/>
            <Label x:Name="labelDescription" Content="Additional Information:" HorizontalAlignment="Left" Margin="10,109,0,0" Grid.Row="1" VerticalAlignment="Top"/>
            <TextBox x:Name="txtDescription" HorizontalAlignment="Left" Height="107" Margin="10,140,0,0" Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Top" Width="261"/>
        </Grid>
    </UserControl>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="27*"/>
        <RowDefinition Height="619*"/>
        <RowDefinition Height="27*"/>
    </Grid.RowDefinitions>
    <Menu x:Name="menu" HorizontalAlignment="Stretch" Margin="0,0,0,0" Grid.RowSpan="1" VerticalAlignment="Stretch">
        <MenuItem Header="_File" x:Name="menuFile" HorizontalAlignment="Center" Height="27" Width="28">
        </MenuItem>
        <MenuItem Header="_Edit" x:Name="menuEdit" HorizontalAlignment="Center"/>
        <MenuItem Header="_Tools" x:Name="menuTools" HorizontalAlignment="Center">
            <MenuItem Header="_Manage Remote Sites" x:Name="menuManageRemoteSItes" HorizontalAlignment="Left"/>
        </MenuItem>
        <MenuItem Header="_Windows" x:Name="menuWindows" HorizontalAlignment="Center"/>
        <MenuItem Header="_Reports" x:Name="menuReports" HorizontalAlignment="Center"/>
        <MenuItem Header="_Help" x:Name="menuHelp" HorizontalAlignment="Center"/>
    </Menu>
    <TabControl x:Name="tabControl" HorizontalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" VerticalAlignment="Stretch" SelectionChanged="tabControl_SelectionChanged">
        <TabItem Header="Test" Content="{DynamicResource RemoteSiteUserControl}"/>
    </TabControl>
</Grid>

【问题讨论】:

  • 您可以在此处添加您的代码到问题中吗?我们通常不喜欢将代码发布在其他网站上,因为如果链接已关闭或用户无法访问,那么他们就无法帮助您解决问题。
  • 明白。将在上面进行编辑,谢谢。
  • WPF 背后的理念是,您的应用程序就是您的代码类,而您的 UI 只是一个非常用户友好的界面,位于您的类之上。您在这里看到的是旧的 WinForms 做事方式,您将应用程序作为 UI 对象。也许this answer 可以帮助您在 WPF 的正确轨道上起步 :)

标签: c# wpf xaml


【解决方案1】:

为了解决您设计中的直接问题,我会避免点击事件,而是使用带有 DataContext 的命令。您可以将 TabItem 的数据上下文分配给单独的 C# 类(视图模型),然后绑定到资源中的命令。

<TabItem DataContext="{Binding MyViewModelDataContext}" />

请注意,MyViewModelDataContext 必须在您的 .xaml.cs 代码中实例化为公共属性,以便可以绑定。

然后你可以在模板中使用命令,因为它是一个绑定:

<Button Command="{Binding MyCommand}" />

命令在 MyViewModelDataContext 中实现的位置。

这是一个有用的命令概述: How to Bind a Command in WPF

我也使用 DevExpress 的 MVVM 框架,他们有一个非常好的命令实现。

另外:您的整个 XAML 代码中的绑定为零。阅读绑定;它会帮助你。这是一个很好的链接,它为您介绍了绑定: http://blog.scottlogic.com/2012/04/20/everything-you-wanted-to-know-about-databinding-in-wpf-silverlight-and-wp7-part-two.html

希望对您有所帮助。

【讨论】:

  • 这绝对有帮助。在问了这个问题之后,我退后一步,决定在充实这个客户端设计之前,我应该多阅读一些关于 WPF 的内容。谢谢你的资源。
猜你喜欢
  • 2019-03-15
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 2015-03-05
  • 1970-01-01
相关资源
最近更新 更多