动态添加时,WPF控件对齐错误

时间:2016-04-21 04:23:09

标签: wpf vb.net xaml

嗨,我以为我可以轻松解决这个问题,但这让我发疯了。

我正在使用UserControl来容纳基于VLC的视频播放器控件,以及播放和停止按钮等。然后我将UserControl放在我的主窗体上。如果UserControl在XAML中声明,则表现正常。

我决定重写代码以动态实例化我的UserControl,以防我需要销毁它并在运行中创建另一个。但是,当我这样做的时候,视频移动到其容器的顶部而不是中间。

enter image description here

UserControl相关部分在这里:

<Grid x:Name="LayoutParent" >
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="12" />
        </Grid.RowDefinitions>

        <!-- I comment this if adding player dynamically -->
        <!--<wpf:VlcPlayer Grid.Row="0" x:Name="Player" />-->

        <!-- I un-comment this if adding player dynamically -->
        <Grid x:Name="VideoPlayerPanel" Grid.Row="0" Margin="0" />

        <StackPanel Grid.Row="1" Opacity="0.8">
            ...(buttons etc)
        </StackPanel>

        <ProgressBar ...(progressBar etc) />
</Grid>

我的代码隐藏看起来像这样:

Dim Player As VlcPlayer = New VlcPlayer ' uncomment If adding the player dynamically

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Player.SetValue(Canvas.ZIndexProperty, -1)
        VideoPlayerPanel.Children.Add(Player)

        VolumeSlider.Value = 50
    End Sub

我在VideoPlayerPanel上的XAML中尝试了VerticalAlignment="Center"VerticalAlignment="Stretch",视频中心完全消失了,Stretch仍然与顶部对齐。

任何关于我可能采取哪些措施来集中统一的想法都会非常感激!

3 个答案:

答案 0 :(得分:1)

添加播放器dynamiccaly时,您会得到不同的结果,因为您将Play包装在其他网格中。尝试将Player直接添加到LayoutParent的第一行:

Player.SetValue(Grid.Row, 0)
LayoutParent.Children.Add(Player)

答案 1 :(得分:1)

感谢所有回复。

我做了一些更多的研究,我在一个矩形代替玩家控制,它完美对齐。这让我发现第三方控制本身就是错误的。我必须直接获取源并更改VerticalAlignment。

对不起,我们很抱歉。

答案 2 :(得分:0)

从第一个Height="*"移除Row*用于占用剩余空间,因此最好将其用于最后Row

使用固定宽度和/或Auto