Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何动态生成必须放置在动态生成的GroupBox中的切换按钮 我是C++开发人员,最近搬到C。我正在开发WPF应用程序,它处理GroupBox的动态生成。各个groupbox中存在的RadioButton、togglebutton等UI组件必须动态生成_C#_.net_Wpf_Mvvm_Toggle - Fatal编程技术网

C# 如何动态生成必须放置在动态生成的GroupBox中的切换按钮 我是C++开发人员,最近搬到C。我正在开发WPF应用程序,它处理GroupBox的动态生成。各个groupbox中存在的RadioButton、togglebutton等UI组件必须动态生成

C# 如何动态生成必须放置在动态生成的GroupBox中的切换按钮 我是C++开发人员,最近搬到C。我正在开发WPF应用程序,它处理GroupBox的动态生成。各个groupbox中存在的RadioButton、togglebutton等UI组件必须动态生成,c#,.net,wpf,mvvm,toggle,C#,.net,Wpf,Mvvm,Toggle,目前我有两个xaml文件CodecView.xaml和CodecWidgetView.xaml,这两个xaml文件都有一个单独的viewmodel类。这个充满活力的一代人很有趣,但对我来说肯定是个棘手的问题。让我向您展示动态生成一组GroupBox的代码 CodecView.xaml: <UserControl.Resources> <DataTemplate x:Key="CWDataTemplate"> <StackPanel>

目前我有两个xaml文件
CodecView.xaml
CodecWidgetView.xaml
,这两个xaml文件都有一个单独的viewmodel类。这个充满活力的一代人很有趣,但对我来说肯定是个棘手的问题。让我向您展示动态生成一组GroupBox的代码

CodecView.xaml:

<UserControl.Resources>
    <DataTemplate x:Key="CWDataTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Description}" Margin="5,5,0,0"/>
            <local:CodecWidgetView Margin="5,10,5,5"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>

<Grid Grid.Row="0" Style="{DynamicResource styleBackground}">          
        <Grid Name="NumberofCodecs" >
            <ItemsControl ItemTemplate="{StaticResource CWDataTemplate}" ItemsSource="{Binding CodecWidgets}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Grid>            
 </Grid>
<Grid>
    <GroupBox Height="Auto" HorizontalAlignment="Stretch" Margin="5,5,5,5" Name="groupBox1" VerticalAlignment="Stretch" Width="Auto">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>

            <Grid Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <ToggleButton Name="MasterBox" Content="Master" Command="{Binding MasterCommand}" IsChecked="{Binding MasterCheck}" Grid.Column="1" Height="25" Width="50" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0" />
                <ComboBox Grid.Column="2" ItemsSource="{Binding ModesList}" SelectedItem="{Binding SelectedModesList, Mode=OneWayToSource}" SelectedIndex="2" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="comboBox2" VerticalAlignment="Center" Width="80" />
                <ComboBox Grid.Column="0" ItemsSource="{Binding FrequencyList}" SelectedItem="{Binding SelectedFrequencyList, Mode=OneWayToSource}" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="comboBox1" VerticalAlignment="Center" Width="80" />
            </Grid>

            <Grid Grid.Row="1">
                //Here I want to dynamically generate 4 radio buttons
            </Grid>

            <Grid Grid.Row="2">
                <Label Name="BitDelay" Content="Bit Delay" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,205,0" Height="25" Width="55" />
                <Slider Height="23" HorizontalAlignment="Center" Value="{Binding BitDelayValue, Mode=TwoWay}" Minimum="0.0" Maximum="255.0" TickFrequency="1.0" Margin="95,0,0,0" Name="bitdelayslider" VerticalAlignment="Center" Width="160" />
                <TextBox Name="BitDelayValue" IsReadOnly="True" Text="{Binding ElementName=bitdelayslider,Path=Value, StringFormat=0.0}" Width="40" Height="20" Margin="0,0,110,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Grid>

            <Grid Grid.Row="3">
                <Label Name="DBGain" Content="DB Gain" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,205,0" Height="25" Width="55" />
                <TextBox Name="DBGainValue" IsReadOnly="True" Text="{Binding ElementName=dbgainslider,Path=Value, StringFormat=0.0}" Width="40" Height="20" Margin="0,0,110,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
                <Slider Height="23" HorizontalAlignment="Center" Value="{Binding DBGainValue, Mode=TwoWay}" Minimum="0.0" Maximum="59.5" TickFrequency="0.5" Margin="95,0,0,0" Name="dbgainslider" VerticalAlignment="Center" Width="160" />
            </Grid>
        </Grid>
    </GroupBox>
</Grid>
public ObservableCollection<CodecWidgetViewModel> CodecWidgets { get; set; }

    public CodecViewModel()
    {
        CodecWidgets = new ObservableCollection<CodecWidgetViewModel>();
        CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 8  - Dig Mic A" });
        CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 9  - Dig Mic B" });
        CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 10  - PCM A 3P3V" });
        CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 11  - PCM B 3P3V" });
    }
private string _description;
    public string Description
    {
        get
        { 
            return _description; 
        }

        set
        {
            _description = value;
            OnPropertyChanged("Description");
        }
    }
<Grid Grid.Row="1">
     <Grid.ColumnDefinitions>
           <ColumnDefinition />
           <ColumnDefinition />
           <ColumnDefinition />
           <ColumnDefinition />
     </Grid.ColumnDefinitions>
     <ToggleButton Grid.Column="0" Content="16Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="16"/>
     <ToggleButton Grid.Column="1" Content="20Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="20"/>
     <ToggleButton Grid.Column="2" Content="24Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="24"/>
     <ToggleButton Grid.Column="3" Content="32Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="32"/>
</Grid>
    RelayCommand _toogleButtonCommand;
    public ICommand ToogleButtonCommand
    {
        get
        {
            if (_toogleButtonCommand == null)
            {
                _toogleButtonCommand = new RelayCommand(this.DoSomethingExecute,
                    this.DoSomethingCanExecute);
            }
            return _toogleButtonCommand;
        }
    }

    public void DoSomethingExecute(object param)
    {
       int result = Convert.ToInt32(param);

        if (result == 16)
        {
            //To this and so on for example
        }
    }
这在启动时给了我4个GroupBox。以下是要求:

  • 查看一下
    codewidgetview.xaml
    ,您会发现我添加了组合框、滑块等,但在
    Grid.Row=2
    中,我想动态生成4个切换按钮,内容如下:
    16位、20位、24位和32位
    
  • 一旦发生这种情况,此按钮上必须只有一个单击事件,它设置togglestate并执行一些语句
  • 这就是我在C++中所做的:

    //In Constructor
    for(int jj = 0; jj < 4; jj++)
    {
        m_codecBitLengthButton[jj] = new ToggleButton(bitLengthes[jj]); //Here bitlength consists of 16Bit, 20Bit, 24Bit and 32Bit
        m_codecBitLengthButton[jj]->setRadioGroupId(55); // make a custom group ID
        addAndMakeVisible(m_codecBitLengthButton[jj]);
        m_codecBitLengthButton[jj]->addButtonListener(this);
        m_codecBitLengthButton[jj]->setToggleState(false, false);
    }
    // check which button should be pressed
        cmd = (0x9400 | (m_slot & 0xFF));
    m_msp430->ReadInternalCommand(cmd, 1, readBuf); //This returns some value in readBuf
    m_bitLength = readBuf[0];
    m_codecBitLengthButton[readBuf[0]]->setToggleState(true, false); //Togglestate set to true on startup based on readBuf[0]
    
    
    //Gets called when any of the toggle button is clicked
    while(jj < 4)
    {
        if(button == m_codecBitLengthButton[jj])
        {
            // add code for bit length support
            cmd = ((CODEC_LENGTH_CMD & 0x7F00) | (m_slot & 0xFF));
            sendBuf[numBytes++] = jj; // this should represent the proper number of bits
            m_bitLength = jj;
            break;
        }
        jj++;
    }
    
    //在构造函数中
    对于(intjj=0;jj<4;jj++)
    {
    m_codecBitLengthButton[jj]=new ToggleButton(bitLengthes[jj]);//此处位长由16位、20位、24位和32位组成
    m_codeBitLengthButton[jj]->setRadioGroupId(55);//创建自定义组ID
    addAndMakeVisible(m_codecBitLength按钮[jj]);
    m_codecBitLengthButton[jj]->addButtonListener(此);
    m_codecBitLengthButton[jj]->setToggleState(假,假);
    }
    //检查应按下哪个按钮
    cmd=(0x9400 |(m|U插槽和0xFF));
    m_msp430->ReadInternalCommand(cmd,1,readBuf)//这将在readBuf中返回一些值
    m_bitLength=readBuf[0];
    m_codeCBitLength按钮[readBuf[0]]->setToggleState(真、假)//基于readBuf[0]启动时将Togglestate设置为true
    //在单击任何切换按钮时调用
    而(jj<4)
    {
    if(button==m_codecBitLengthButton[jj])
    {
    //为位长度支持添加代码
    cmd=((编解码器长度cmd&0x7F00);(m_插槽&0xFF));
    sendBuf[numBytes++]=jj;//这应该表示正确的位数
    m_bitLength=jj;
    打破
    }
    jj++;
    }
    

    我怎样才能在C中实现同样的目标

    您可以通过以下命令执行此操作:

    codeWidgetView.xaml:

    <UserControl.Resources>
        <DataTemplate x:Key="CWDataTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Description}" Margin="5,5,0,0"/>
                <local:CodecWidgetView Margin="5,10,5,5"/>
            </StackPanel>
        </DataTemplate>
    </UserControl.Resources>
    
    <Grid Grid.Row="0" Style="{DynamicResource styleBackground}">          
            <Grid Name="NumberofCodecs" >
                <ItemsControl ItemTemplate="{StaticResource CWDataTemplate}" ItemsSource="{Binding CodecWidgets}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </Grid>            
     </Grid>
    
    <Grid>
        <GroupBox Height="Auto" HorizontalAlignment="Stretch" Margin="5,5,5,5" Name="groupBox1" VerticalAlignment="Stretch" Width="Auto">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
    
                <Grid Grid.Row="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <ToggleButton Name="MasterBox" Content="Master" Command="{Binding MasterCommand}" IsChecked="{Binding MasterCheck}" Grid.Column="1" Height="25" Width="50" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0" />
                    <ComboBox Grid.Column="2" ItemsSource="{Binding ModesList}" SelectedItem="{Binding SelectedModesList, Mode=OneWayToSource}" SelectedIndex="2" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="comboBox2" VerticalAlignment="Center" Width="80" />
                    <ComboBox Grid.Column="0" ItemsSource="{Binding FrequencyList}" SelectedItem="{Binding SelectedFrequencyList, Mode=OneWayToSource}" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0,0,0,0" Name="comboBox1" VerticalAlignment="Center" Width="80" />
                </Grid>
    
                <Grid Grid.Row="1">
                    //Here I want to dynamically generate 4 radio buttons
                </Grid>
    
                <Grid Grid.Row="2">
                    <Label Name="BitDelay" Content="Bit Delay" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,205,0" Height="25" Width="55" />
                    <Slider Height="23" HorizontalAlignment="Center" Value="{Binding BitDelayValue, Mode=TwoWay}" Minimum="0.0" Maximum="255.0" TickFrequency="1.0" Margin="95,0,0,0" Name="bitdelayslider" VerticalAlignment="Center" Width="160" />
                    <TextBox Name="BitDelayValue" IsReadOnly="True" Text="{Binding ElementName=bitdelayslider,Path=Value, StringFormat=0.0}" Width="40" Height="20" Margin="0,0,110,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Grid>
    
                <Grid Grid.Row="3">
                    <Label Name="DBGain" Content="DB Gain" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,205,0" Height="25" Width="55" />
                    <TextBox Name="DBGainValue" IsReadOnly="True" Text="{Binding ElementName=dbgainslider,Path=Value, StringFormat=0.0}" Width="40" Height="20" Margin="0,0,110,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    <Slider Height="23" HorizontalAlignment="Center" Value="{Binding DBGainValue, Mode=TwoWay}" Minimum="0.0" Maximum="59.5" TickFrequency="0.5" Margin="95,0,0,0" Name="dbgainslider" VerticalAlignment="Center" Width="160" />
                </Grid>
            </Grid>
        </GroupBox>
    </Grid>
    
    public ObservableCollection<CodecWidgetViewModel> CodecWidgets { get; set; }
    
        public CodecViewModel()
        {
            CodecWidgets = new ObservableCollection<CodecWidgetViewModel>();
            CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 8  - Dig Mic A" });
            CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 9  - Dig Mic B" });
            CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 10  - PCM A 3P3V" });
            CodecWidgets.Add(new CodecWidgetViewModel { Description = "Location 11  - PCM B 3P3V" });
        }
    
    private string _description;
        public string Description
        {
            get
            { 
                return _description; 
            }
    
            set
            {
                _description = value;
                OnPropertyChanged("Description");
            }
        }
    
    <Grid Grid.Row="1">
         <Grid.ColumnDefinitions>
               <ColumnDefinition />
               <ColumnDefinition />
               <ColumnDefinition />
               <ColumnDefinition />
         </Grid.ColumnDefinitions>
         <ToggleButton Grid.Column="0" Content="16Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="16"/>
         <ToggleButton Grid.Column="1" Content="20Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="20"/>
         <ToggleButton Grid.Column="2" Content="24Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="24"/>
         <ToggleButton Grid.Column="3" Content="32Bit" Command="{Binding Path=ToogleButtonCommand}" CommandParameter="32"/>
    </Grid>
    
        RelayCommand _toogleButtonCommand;
        public ICommand ToogleButtonCommand
        {
            get
            {
                if (_toogleButtonCommand == null)
                {
                    _toogleButtonCommand = new RelayCommand(this.DoSomethingExecute,
                        this.DoSomethingCanExecute);
                }
                return _toogleButtonCommand;
            }
        }
    
        public void DoSomethingExecute(object param)
        {
           int result = Convert.ToInt32(param);
    
            if (result == 16)
            {
                //To this and so on for example
            }
        }
    
    希望这有帮助

    编辑: 要定义随时检查哪个按钮,请绑定ViewModel中的ToogleButtons IsChecked属性和ToogleButton值的属性

    private bool _isCheckedToogle1;
    public bool IsCheckedToogle1
    {
        get { return _isCheckedToogle1; }
        set
        {
            _isCheckedToogle1 = value;
            OnPropertyChanged("IsCheckedToogle1");
        }
    }
    
    private int _toogleButton1Value = 16;
    public int ToogleButton1Value
    {
       get { return _toogleButton1Value; }
       set
       {
          _toogleButton1Value = value;
          OnPropertyChanged("ToogleButton1Value");
       }
    }
    
    XAML:

    还有你的新CommandLogik

        public void DoSomethingExecute(object param)
        {
            ToggleValue result = param as ToggleValue;
    
            if (result.Value == 16)
            {
                result.View.IsCheckedToogle1 = true;
                result.View.IsCheckedToogle2 = false;
                result.View.IsCheckedToogle3 = false;
                result.View.IsCheckedToogle4 = false;
            }
        }
    

    这些按钮上的内容是动态的吗?或者你所说的动态生成是什么意思?如果始终有4个按钮,只需将它们添加到xaml@Mark:You's back mate:)只有4个按钮,所有按钮都执行几乎相同的一组语句,只是做了一些小改动。请注意,这些按钮的内容必须动态生成。我的意思是Btn1的名称是16位,Btn2的名称是20位,依此类推。基于for循环,我只想以这样一种方式生成它们,我可以使用一个单击方法来处理切换状态等等,而不是重复4次。好吧,兄弟,你的代码总是工作得很好:)现在,我希望所有4个按钮都像单选按钮一样工作,即一次只检查一个按钮。其次,如果您检查代码:
    cmd=(0x9400 |(m_slot&0xFF));m_msp430->ReadInternalCommand(cmd,1,readBuf)//这将返回readBuf m_bitLength=readBuf[0]中的某个值;m_codeCBitLength按钮[readBuf[0]]->setToggleState(真、假)
    在我的示例中,您会发现`readBuf[0]在启动时将一个按钮设置为选中状态,因为此代码存在于构造函数中。我如何在您的方法中实现它?有一些可能性可以做到这一点,请给我几分钟时间,我将在
    更新行异常,因为
    在“System.Windows.StaticResourceExtension”上提供值时引发了异常。
    是的,当然。。。您必须将转换器添加到资源中。例如,虽然它现在运行,但如果(result.Value==16)
    对象引用未设置为对象的实例,则会在
    处引发异常。
    每当我单击任何按钮时。