在IronPython中创建自定义WPF控件:由标准控件组成的控件

3

我看过其他关于自定义控件创建的问题,以及其他在线资源,但我不知道如何创建一个不需要C#代码后台文件的自定义控件。由于我的项目是纯IronPython,我不知道如何将C#代码后台集成到它中。

我尝试做的事情甚至都不复杂;没有混乱的样式或渲染转换之类的东西。我只是试图创建一个由我已有的一些现有控件组成的组合控件,以便我可以程序化地添加/删除这些组合控件。例如,我有这个GroupBox:

正如你所见,它只是一个带有HeaderText和ComboBox的GroupBox,其主体由包含一些CheckBoxes的UniformGrid填充。以下是XAML:

<GroupBox Name="DO1">
    <GroupBox.Header>
        <DockPanel>
            <TextBlock VerticalAlignment="Center">DO1</TextBlock>
            <ComboBox Name="DO1DeviceList" Margin="3 0 0 0" ItemsSource="{Binding DOtable}">
            </ComboBox>
        </DockPanel>
    </GroupBox.Header>
    <UniformGrid Rows="1">
        <StackPanel>
            <Label Content="3W1L" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o1" IsChecked="{Binding o1}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="3W3V" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o2" IsChecked="{Binding o2}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="2" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="Ni" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o3" IsChecked="{Binding o3}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="3" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="2W1" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o4" IsChecked="{Binding o4}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="4" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="Vac2" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o5" IsChecked="{Binding o5}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="5" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="3W4V" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o6" IsChecked="{Binding o6}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="6" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="Cu" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o7" IsChecked="{Binding o7}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="7" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
            <Label Content="3W2L" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <CheckBox Name="DO1o8" IsChecked="{Binding o8}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Label Content="8" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </StackPanel>
    </UniformGrid>
</GroupBox>

我读过控件合成的相关内容,也就是将一堆控件组合在一个单独的控件中。我想让整个GroupBox成为一个可以在程序中动态添加或删除的单独控件。我该如何用IronPython实现这个功能呢?


看起来你包含的图片已经不存在了。 - undefined
1个回答

1

我仍然觉得有更好的方法,所以我会让这个问题保持开放状态,但我最终采用的 IronPython 中运行时添加自定义控件的方式是将 XAML 放在一个单独的文件中,使用 XamlReader.Load() 加载它,并将返回值存储在一个新对象中。该对象成为控件,然后可以添加到 GridDockPanel 或其他容器中。我花了一些时间才意识到我可以使用 XamlReader 从 XAML 构建任何控件,而不仅仅是 Window

with File.OpenRead("MyControl.xaml") as xamlfile:
    newcontrol = System.Windows.Markup.XamlReader.Load(xamlfile)

ui.FindName("MyDockPanel").Children.Add(newcontrol)

XAML文件中只包含上述提到的GroupBox标记,以及一个xmlns属性来建立正确的命名空间。

<GroupBox Name="DO1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <GroupBox.Header>
    ...

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