使用“交互”请求的“自定义”弹出窗口的大小

时间:2015-11-19 13:16:22

标签: prism

我使用了自定义确认弹出窗口,这是XAML:

DataRow[] bdArray = new DataRow[table.RowCount];

Parallel.ForEach(table, new ParallelOptions { MaxDegreeOfParallelism = 2 }, row =>
{
    DataRow newrow = BDDestino.newrow("Cars");

    newrow["Code"] = row["CODE"];
    newrow["Name"] = row["NAME"];

    // Add the new row in a pre-arranged position
    int index = table.indexOf(row);

    bdArray[index] = newrow;
 });

这是代码behide:

<Grid>
    <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding Content}" TextWrapping="Wrap" Width="150"/>
    <StackPanel Orientation="Horizontal" Margin="6" Grid.Row="1">
            <Button x:Name="YesBtn" Width="100" Content="OK" Click="OnOk_Click"/>
            <Button x:Name="NoBtn" Width="100" Content="No" Click="OnNo_Click"/>
    </StackPanel>
</Grid>

在视图模型类中,我有:

  • 两个命令(DispalyLongTextCommand和DispalyShortTextCommand):一个 显示长信息,另一条显示短信
  • 我有InteractionRequest ConfirmationRequest 在ctor中初始化的对象以引发交互。

如果我首先显示长消息,我的自定义窗口会将其内容调整为空洞消息,这没关系! 但如果要显示短信,我的窗口会保留以前的大小!

注意:即使我将窗口SizeToContent样式设置为WidthAndHeight但它不起作用。

public partial class CustomConfirmation : IInteractionRequestAware
{
    public CustomConfirmation()
    {
        InitializeComponent();
    }
    public IConfirmation Confirmation
    {
        get { return this.DataContext as IConfirmation; }
        set { this.DataContext = value; }
    }

    public string Title { get; set; }
    public bool Confirmed { get; set; }
    public INotification Notification { get; set; }
    public Action FinishInteraction { get; set; }
    private void OnOk_Click(object sender, RoutedEventArgs e)
    {
        if (FinishInteraction != null)
        {
            Confirmation.Confirmed= true;
            FinishInteraction();
        }
    }

    private void OnNo_Click(object sender, RoutedEventArgs e)
    {
        if (FinishInteraction != null)
        {
            Confirmation.Confirmed = false;
            FinishInteraction();
        }
    }
}

size of the window depends on the content

Window keep the previous size

你可以指导我吗? 提前谢谢

解: 我通过在自定义弹出窗口后面的代码中添加此代码来解决问题:

<ei:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject="{Binding ConfirmationRequest, Mode=TwoWay}">
            <prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True">
                <prism:PopupWindowAction.WindowStyle>
                    <Style TargetType="Window">
                        <Setter Property="SizeToContent" Value="WidthAndHeight"/>
                    </Style>
                </prism:PopupWindowAction.WindowStyle>
                <prism:PopupWindowAction.WindowContent>
                    <local:CustomConfirmation/>
                </prism:PopupWindowAction.WindowContent>
            </prism:PopupWindowAction>
        </prism:InteractionRequestTrigger>
    </ei:Interaction.Triggers>

2 个答案:

答案 0 :(得分:2)

每次显示新弹出窗口时都会重复使用WindowContent属性。因此,当您首次显示弹出窗口时,会显示CustomPopupView,并根据当前内容设置高度。现在,当您关闭弹出窗口并将内容更改为更大的消息然后再次显示时,CustomPopupView.Height已经由上一个操作设置,并且未及时更新以使新窗口获得正确的高度。因此,您现在必须调整窗口大小以匹配CustomPopupView高度的新大小。所以只需添加一些代码就可以在你的代码隐藏中处理这个:

    public CustomPopupView()
    {
        InitializeComponent();
        Loaded += CustomPopupView_Loaded;
    }

    private void CustomPopupView_Loaded(object sender, RoutedEventArgs e)
    {
        var parentWindow = this.Parent as Window;
        if (parentWindow != null)
            parentWindow.MinHeight = _txt.ActualHeight + 75;
    }

注意:'_ txt'是带有内容绑定的TextBlock的名称。

答案 1 :(得分:0)

我认为这与Prism附带的默认确认窗口有关。 MinWidth和MinHeight分别在XAML中设置为300和150。因此,无论窗口内容是什么,窗口宽度/重量都不会变小。覆盖窗口样式不足以满足您的需求。

如果您对此感到满意,可以下载Prism代码并删除该限制。您想要开始的文件的源路径如下所示。

\源\ WPF \ Prism.Wpf \交互\ DefaultPopupWindows \ DefaultConfirmationWindow.xaml

要么是这样,要么让棱镜团队看看他们是否可以使这更灵活,这可能是一个更好的建议。您可以在GitHub页面上将其作为问题发布。 https://github.com/PrismLibrary/Prism/issues