首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从WPF后面的代码中访问XAML按钮

如何从WPF后面的代码中访问XAML按钮
EN

Stack Overflow用户
提问于 2016-09-30 14:06:17
回答 1查看 1.8K关注 0票数 1

我的代码:

代码语言:javascript
运行
复制
<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- true,代码在这里:

代码语言:javascript
运行
复制
 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写的。

如下所示:

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

代码语言:javascript
运行
复制
 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,并简单地设置如下:

代码语言:javascript
运行
复制
btnTakeIt.Content="Order in progress.." 

因此,每次我的网格刷新时,我都可以循环我的命令,检查是order InProgress,然后我可以将按钮btnTakeIt内容设置为"Order in progress.“

或者,如果有任何其他方式,我是开放的尝试!

我已经尝试过了,但是我的btnTakeIt在以下代码中是不可访问的:(

编辑:

代码语言:javascript
运行
复制
 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语句的内部,当我查看断点时,它会自动更改内容,但是在网格上,我看不到任何更改:(

编辑:

我必须指出,我的类产品包含在我的OrdersController中:)

@Ayuman你对此有何看法?

代码语言:javascript
运行
复制
<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>

代码背后:

代码语言:javascript
运行
复制
 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;
    }

这样我就可以通过编程检查订单状态并设置按钮的内容。可能是个好办法吗?

EN

Stack Overflow用户

发布于 2016-09-30 16:12:21

请参考下面的代码。我试着让它发挥作用。希望这对你也有用

代码语言:javascript
运行
复制
 <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));
        }
    }
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39793431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档