【问题标题】:How to access XAML button from code behind WPF如何从 WPF 后面的代码访问 XAML 按钮
【发布时间】:2017-02-09 03:28:26
【问题描述】:

我的代码:

<DataGrid  HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Hidden"  BorderBrush="#83D744" IsSynchronizedWithCurrentItem="False" VerticalGridLinesBrush="Transparent" Grid.Column="0"   RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False"  x:Name="datagrid1" Margin="10,150,8,50" Background="Transparent" RowBackground="#FF494949"  VerticalContentAlignment="Center" HorizontalContentAlignment="Center" ItemsSource="{Binding}">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Background" Value="#83D744"/>
            <Setter Property="Opacity" Value="1"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="HorizontalContentAlignment" Value="Center" />
            <Setter Property="FontSize" Value="18"/>
            <Setter Property="FontFamily" Value="Arial"/>
            <Setter Property="Height" Value="50"/>
        </Style>


<Style x:Key="TextInCellCenter" TargetType="{x:Type TextBlock}" >
    <Setter Property="TextAlignment" Value="Center"/>
</Style>
<Style TargetType="{x:Type TextBlock}" x:Key="RightAligElementStyle">
    <Setter Property="TextAlignment" Value="Right"/>
</Style>
<Style TargetType="{x:Type TextBlock}" x:Key="LeftAligElementStyle">
    <Setter Property="TextAlignment" Value="Left"/>
</Style>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
           Color="Transparent"/>
</DataGrid.Resources>


<DataGrid.Columns >
    <DataGridTextColumn Binding="{Binding ProductName}"     ElementStyle="{StaticResource LeftAligElementStyle}"     Header="NAZIV ARTIKLA" MinWidth="350"    Foreground="White" FontSize="20" FontFamily="Verdana" />
    <DataGridTextColumn Binding="{Binding Quantity}"        ElementStyle="{StaticResource TextInCellCenter}"         Header="KOLIČINA"   MinWidth="200" Foreground="White"      FontSize="20" FontFamily="Verdana" />
</DataGrid.Columns>

<DataGrid.GroupStyle>
    <!-- Style for groups at top level. -->
    <GroupStyle>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander IsExpanded="True"  Background="Black" Opacity="0.7">
                                <Expander.Header >
                                    <DockPanel Height="50" Margin="0,0,0,0"  Name="dockPanel" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=ActualWidth}">

                                        <Button Name="btnFinishOrder" Content="Finish Order" Margin="0,0,55,5" DockPanel.Dock="Right" Click="btnFinishOrder_Click" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left"  VerticalAlignment="Bottom"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  Foreground="#83D744"  Background="Transparent"  BorderBrush="#83D744" Width="130"   Height="40">
                                             <Button.Template>
                                                <ControlTemplate TargetType="Button">
                                                <Border BorderThickness="{TemplateBinding BorderThickness}"
                                                        BorderBrush=    "{TemplateBinding BorderBrush}"
                                                        Background=     "{TemplateBinding Background}">
                                                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                                                </Border>
                                                </ControlTemplate>
                                             </Button.Template>
                                         </Button>

                                         <Button Name="btnTakeIt" Click="btnTakeIt_Click"  Content="Take it" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left"  VerticalAlignment="Bottom"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  Foreground="#83D744"  Background="Transparent"  BorderBrush="#83D744" Width="130"   Height="40">
                                             <Button.Template>
                                                <ControlTemplate TargetType="Button">
                                                <Border BorderThickness="{TemplateBinding BorderThickness}"
                                                        BorderBrush="{TemplateBinding BorderBrush}"
                                                        Background="{TemplateBinding Background}">
                                                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                                                </Border>
                                                </ControlTemplate>
                                             </Button.Template>
                                        </Button>
                                        <TextBlock FontWeight="Normal" FontFamily="Verdana" FontSize="20" Height="25" Foreground="#83D744" Text="{Binding Path=Name,StringFormat= Number of Order:# {0}}" />

                                    </DockPanel>
                                </Expander.Header>
                                <Expander.Content>
                                    <ItemsPresenter />
                                </Expander.Content>
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

你们可以看到,当我点击按钮 Click="btnTakeIt_Click" 时,我会以编程方式将按钮文本更改为“订单进行中”。我将数据库中的字段 IsInProgres 更新为 1 - 是的,代码在这里:

 private void btnTakeIt_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;

        CollectionViewGroup group = b.DataContext as CollectionViewGroup;
        var x = group.Name;
        int orderNumber = Convert.ToInt32(x);

        b.BorderBrush = null;
        b.Content = "Order is in progress";
        b.FontSize = 12;

        OrdersController.SetOrderInProgressByID(orderNumber);

    }

但是发生了什么,因为我每 20 秒刷新一次我的网格,我的按钮内容又变成了默认的“接受它!”因为那是用 XAML 编写的。

像这样:

这是我的代码(每隔几秒刷新一次):

 public MainWindow()
{
    try
    {


        InitializeComponent();


        this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
        this.WindowState = WindowState.Maximized;

        var ordersList = OrdersController.localOrders();


        collectionViewSource.Source = ordersList;
        collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));
        DataContext = collectionViewSource;

        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(20);
        timer.Tick += timer_Tick;
        timer.Start();

    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

void timer_Tick(object sender, EventArgs e)
{

    var ordersList = OrdersController.localOrders();
    collectionViewSource.Source = null;
    collectionViewSource.Source = ordersList;

    DataContext = collectionViewSource;

    datagrid1.ScrollIntoView(datagrid1.Items[datagrid1.Items.Count - 1]);
}

}

所以我的问题是我能否以某种方式循环我的 localOrders 并检查 NumberOfOrder 是否有 IsInProgress = 1 并简单地设置:

btnTakeIt.Content="Order in progress.." 

因此,每次刷新网格时,我都可以循环我的订单,并检查订单InProgress,然后我可以将按钮 btnTakeIt 内容设置为“订单进行中..”

或者如果有其他方法,我也愿意尝试!

P.S 我已经尝试过了,但我的 btnTakeIt 在后面的代码中无法访问:(

编辑:

 void timer_Tick(object sender, EventArgs e)
    {
        Button MyButton = FindChild<Button>(datagrid1, "btnTakeIt");

        var ordersList = OrdersController.localOrders();
        collectionViewSource.Source = null;
        collectionViewSource.Source = ordersList;
        foreach (var item in ordersList)
        {
            if (item.IsInProgress== true)
            {
                MyButton.Content = "Order is in progress";
            }
        }

        DataContext = collectionViewSource;


    }

我可以这样做吗?我检查了调试器,它正在进入 if 语句内部,当我查看断点时,它实际上会更改内容,但在网格上我看不到任何更改:(

编辑:

我必须提到我的类 Product 包含在我的 OrdersController 中:)

@Ayuman 您对此有何看法:

<Button Name="btnTakeIt"   DataContext="{Binding Items[0]}" Content="{Binding Status}"Click="btnTakeIt_Click"  Content="Take it" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left"  VerticalAlignment="Bottom"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  Foreground="#83D744"  Background="Transparent"  BorderBrush="#83D744" Width="130"   Height="40">
                                         <Button.Template>
                                            <ControlTemplate TargetType="Button">
                                            <Border BorderThickness="{TemplateBinding BorderThickness}"
                                                    BorderBrush="{TemplateBinding BorderBrush}"
                                                    Background="{TemplateBinding Background}">
                                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                                            </Border>
                                            </ControlTemplate>
                                         </Button.Template>
                                    </Button>

后面的代码:

 public static List<LocalOrders> localOrders()
    {
        var results = DataServices.POS.proc_GetAllOrders().ToList();


        List<LocalOrders> localOrdersList = new List<LocalOrders>();

        foreach (var item in results)
        {
            LocalOrders lokal = new LocalOrders();
            if (item.IsInProgress)
            {
                localo.Pihvacena = true;
                localo.Status = "IN PROCESS";
            }
            else
            {
                lokalne.Status = "IT IS NOT YET IN PROCESS";
            }


            lokal.User = item.User;
            lokal.Quantity = Convert.ToInt32(item.Quantity);
            lokal.Title = item.Title;
            lokal.NumberOfOrder = item.NumberOfOrder;
            localOrdersList.Add(lokal);
        }
        return localOrdersList;
    }

所以我可以以编程方式检查订单状态并设置按钮的内容......这可能是一个好的解决方案吗?

【问题讨论】:

  • 您可以使用帖子中建议的方法遍历可视化树。 stackoverflow.com/questions/16997951/…
  • @Ayyappan Subramanian 我从你的链接中编辑了以下帖子,你能看看编辑伙伴吗,我可能做错了什么,我找到了按钮和它的内容,但我不能改变它大大地。检查编辑老兄
  • 我认为您没有更改文本,文本都显示“订单正在进行中”。
  • @AyyappanSubramanian 那么我该怎么办? :) 非常感谢
  • @AyyappanSubramanian 我用不同的文本进行了测试,没有发生任何事情,也许我在那里做错了什么......

标签: wpf button datagrid window dockpanel


【解决方案1】:

请参考以下代码。我试图让它工作。希望这对你也有用

 <DataGrid  HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Hidden"  BorderBrush="#83D744" IsSynchronizedWithCurrentItem="False" VerticalGridLinesBrush="Transparent" Grid.Column="0"   RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False"  x:Name="datagrid1" Margin="10,150,8,50" Background="Transparent" RowBackground="#FF494949"  VerticalContentAlignment="Center" HorizontalContentAlignment="Center" ItemsSource="{Binding}">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Background" Value="#83D744"/>
                <Setter Property="Opacity" Value="1"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="FontFamily" Value="Arial"/>
                <Setter Property="Height" Value="50"/>
            </Style>


            <Style x:Key="TextInCellCenter" TargetType="{x:Type TextBlock}" >
                <Setter Property="TextAlignment" Value="Center"/>
            </Style>
            <Style TargetType="{x:Type TextBlock}" x:Key="RightAligElementStyle">
                <Setter Property="TextAlignment" Value="Right"/>
            </Style>
            <Style TargetType="{x:Type TextBlock}" x:Key="LeftAligElementStyle">
                <Setter Property="TextAlignment" Value="Left"/>
            </Style>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
       Color="Transparent"/>
        </DataGrid.Resources>


        <DataGrid.Columns >
            <DataGridTextColumn Binding="{Binding ProductName}"     ElementStyle="{StaticResource LeftAligElementStyle}"     Header="NAZIV ARTIKLA" MinWidth="350"    Foreground="White" FontSize="20" FontFamily="Verdana" />
            <DataGridTextColumn Binding="{Binding Quantity}"        ElementStyle="{StaticResource TextInCellCenter}"         Header="KOLIČINA"   MinWidth="200" Foreground="White"      FontSize="20" FontFamily="Verdana" />
        </DataGrid.Columns>

        <DataGrid.GroupStyle>
            <!-- Style for groups at top level. -->
            <GroupStyle>
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <DataGridRowsPresenter/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True"  Background="Black" Opacity="0.7">
                                        <Expander.Header >
                                            <DockPanel Height="50" Margin="0,0,0,0"  Name="dockPanel" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=ActualWidth}">

                                                <Button Name="btnFinishOrder" DataContext="{Binding Items[0]}" Content="{Binding ButtonCaption}" Margin="0,0,55,5" DockPanel.Dock="Right" Click="BtnFinishOrder_OnClick" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left"  VerticalAlignment="Bottom"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  Foreground="#83D744"  Background="Transparent"  BorderBrush="#83D744" Width="130"   Height="40">
                                                    <Button.Template>
                                                        <ControlTemplate TargetType="Button">
                                                            <Border BorderThickness="{TemplateBinding BorderThickness}"
                                                    BorderBrush=    "{TemplateBinding BorderBrush}"
                                                    Background=     "{TemplateBinding Background}">
                                                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                                                            </Border>
                                                        </ControlTemplate>
                                                    </Button.Template>
                                                </Button>

                                                <Button Name="btnTakeIt" Click="BtnTakeIt_OnClick"  DataContext="{Binding Items[0]}" Content="{Binding ButtonCaption}" Margin="0,0,20,5" DockPanel.Dock="Right" FontSize="12" BorderThickness="1.5" HorizontalAlignment="Left"  VerticalAlignment="Bottom"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  Foreground="#83D744"  Background="Transparent"  BorderBrush="#83D744" Width="130"   Height="40">
                                                    <Button.Template>
                                                        <ControlTemplate TargetType="Button">
                                                            <Border BorderThickness="{TemplateBinding BorderThickness}"
                                                    BorderBrush="{TemplateBinding BorderBrush}"
                                                    Background="{TemplateBinding Background}">
                                                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                                                            </Border>
                                                        </ControlTemplate>
                                                    </Button.Template>
                                                </Button>
                                                <TextBlock FontWeight="Normal" FontFamily="Verdana" FontSize="20" Height="25" Foreground="#83D744" Text="{Binding Items[0].ProductName}" />

                                            </DockPanel>
                                        </Expander.Header>
                                        <Expander.Content>
                                            <ItemsPresenter />
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        </DataGrid>

public partial class MainWindow : Window
{
    private ICollectionView view;
    private ObservableCollection<Product> ordersList;
    public MainWindow()
    {
        InitializeComponent();
        this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
        this.WindowState = WindowState.Maximized;

        ordersList = new ObservableCollection<Product>()
        {
            new Product()
            {
                ProductName = "Prodct",
                Quantity = 1,
                NumberOfOrder = 100,
                IsInProgress = true,
                ButtonCaption = "Take it"
            },
            new Product()
            {
                ProductName = "Prodct1",
                Quantity = 2,
                NumberOfOrder = 1000,
                ButtonCaption = "Take it"

            },
            new Product()
            {
                ProductName = "Prodct2",
                Quantity = 3,
                NumberOfOrder = 10000,
                ButtonCaption = "Take it"

            },
            new Product()
            {
                ProductName = "Prodct3",
                Quantity = 4,
                NumberOfOrder = 100000,
                ButtonCaption = "Take it"

            },
        };

        view = CollectionViewSource.GetDefaultView(ordersList);

        view.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));
        DataContext = view;

        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(20);
        timer.Tick += Timer_Tick; ;
        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        foreach (var item in ordersList)
        {
            if (item.IsInProgress)
            {
                item.ButtonCaption = "Order is Still in progress";
            }
        }
    }

    private void BtnFinishOrder_OnClick(object sender, RoutedEventArgs e)
    {
        throw new NotImplementedException();
    }

    private void BtnTakeIt_OnClick(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;

        Product prod = b.DataContext as Product;

        b.BorderBrush = null;
        prod.ButtonCaption = "Order is in progress";
        b.FontSize = 12;
    }
}

class Product:INotifyPropertyChanged
{
    private string productName;

    public string ProductName
    {
        get { return productName ; }
        set
        {
            productName = value ;
            OnPropertyChanged("ProductName");
        }
    }

    private int quantity;

    public int Quantity
    {
        get { return quantity; }
        set
        {
            quantity = value;
            OnPropertyChanged("Quantity");
        }
    }

    public int NumberOfOrder { get; set; }

    public bool IsInProgress { get; set; }

    private string buttonCaption;

    public string ButtonCaption
    {
        get { return buttonCaption; }
        set
        {
            buttonCaption = value;
            OnPropertyChanged("ButtonCaption");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

  • 伙计我明天给你回复,已经检查过了,明天我会实施它并让你回复它是否有效。 + 我需要实现 PropertyChangedEventHandler 和 OnPropertyChanged 方法吗?我都需要吗?
  • 修改了我的属性更改通知。立即查看
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多