将XAML代码转换为C#代码

3

我可以帮您将一个WPF XAML中的数据模板转换成C#代码,也就是说,我可以在.cs文件中通过编程方式创建按钮。

XAML代码如下:

<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Name="buttons" Margin="0">

    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <local:FishEyePanel ScaleToFit="false"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemContainerStyle>
      <Style TargetType="{x:Type ContentPresenter}">
        <Setter Property="ContentTemplate">
          <Setter.Value>
            <DataTemplate>
                <Button Command="Open" Tag="{Binding XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>
            </DataTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </ItemsControl.ItemContainerStyle>

</ItemsControl>

这一行:

<Button Command="Open" Tag="{Binding XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>

这里是我将所有按钮绑定到一个XML文件的地方,以下是文件内容:

<XmlDataProvider x:Key="Things" XPath="Things/Thing">
   <x:XData>
      <Things xmlns="">
         <Thing Button="uno1" Tag="abc"  Width="200" Height="200"/>
      </Things>
   </x:XData>
</XmlDataProvider>

但是我希望的是,不要使用预定义的所有按钮来调用XML文件,而是调用C#中的一种方法来处理这些按钮,就像这样:

public void createButtons()
{
    Button button = new Button();
    button.Tag = "I am from cs";
    buttons.Items.Add(button);
}

这是可能的吗?

我们的createButtons()方法到底是哪里出了问题?一般来说,在XAML中可以做的事情在C#代码中也是可以做到的。 - O. R. Mapper
你为什么想要这样做?使用XAML有什么问题吗? - Mare Infinitus
是的,这是可能的。你尝试过什么?如果你在编码的某个点上卡住了,请询问相关问题。如果你想找一个起点,可以看看buttons.ItemContainerStylebuttons.ItemsPanel,查看它们的类型,然后从那里开始。我不太明白为什么你首先想要做这件事。如果你解释一下为什么想要这样做,有人可能会建议更好的方法。 - Tim S.
@O.R.Mapper - 并不是所有的东西都可以用C#实现。我记得有一个与DataTemplates或者模板相关的问题。这个人@Fernando-Santiago试图打开一扇他/她很快会后悔的门 :) - Alex F
我正在尝试制作这个,因为我需要动态添加按钮,我不知道如何在WPF中实现,但在C#中我可以做到。感谢@Tim S.提供搜索的起点。 - Fernando Santiago
你想为Things中的每个Thing都创建一个按钮吗?如果是这样,那么你的代码似乎已经在尝试做到这一点了(至少是在尝试),如果可能的话,我建议你在XAML中完成所有操作。如果关系比这更复杂,我建议你用一个用户控件来替换你的<Button Command="Open"...,并在其Loaded事件触发时使用代码动态生成基于其DataContext的适当按钮。这样,你就可以使用代码来生成或显示/隐藏正确的元素,同时仍然在XAML中声明大多数内容。 - Tim S.
1个回答

0

你不需要使用C#来实现动态按钮。

我有一个正在运行的应用程序,其中有动态按钮(您可以在代码中添加不同的按钮等等),它们只是在WPF UI中显示。

您只需要创建一个ButtonViewModel对象,然后在代码中放置一个ButtonViewModel列表即可。

using System;
using System.Windows.Input;
using Setup.Common;

namespace ExampleOfButtonList
{
    public class ButtonViewModel : ViewModelBase
    {
        #region Member fields
        protected bool _IsVisible;
        protected bool _IsEnabled;
        protected RelayCommand _ButtonCommand;
        protected String _Text;
        #endregion

        #region Constructors
        /// <summary>
        /// The default constructor
        /// </summary>
        public ButtonViewModel()
        {
        }
        #endregion

        #region Properties
        public virtual ICommand ButtonCommand
        {
            get { return _ButtonCommand; }
            set
            {
                _ButtonCommand = value as RelayCommand;
                NotifyPropertyChanged("ButtonCommand");
            }
        }

        public bool IsVisible
        {
            get { return _IsVisible; }
            set
            {
                _IsVisible = value;
                NotifyPropertyChanged("IsVisible");
            }
        }

        public String Text
        {
            get { return _Text; }
            set
            {
                _Text = value;
                NotifyPropertyChanged("Text");
            }
        }
        #endregion
    }
}

在你的代码中创建这样的列表:
List<ButtonViewModel> buttonList = new List<ButtonViewModel>();
ButtonViewModel bvm1 = new ButtonViewModel();
bvm.ButtonCommand = new RelayCommand(f => SomeMethod());
buttonList.add(bvm1);

注意:您可以从任何MVVM框架或此处获取RelayCommand:MVVM Base.zip

然后使用ItemsControl并将其ItemsSource绑定到buttonList,它将正确显示列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接