Visual Studio C # Печатать все вкладки в TabControl - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь распечатать все вкладки в элементе управления вкладками, используя PrintDialog, но не могу заставить его работать.Я хотел бы, чтобы это работало, - печатать элемент MainGrid с каждой переключаемой вкладкой на новой странице (сейчас это новое задание на печать).Так что здесь у меня было бы две страницы и распечатка MainGrid с вкладками, переключаемыми по-разному на каждой странице.Я попытался использовать selectedIndex TabControl, но он не работает правильно.Я разместил свой xaml и функцию печати, которая не работает. Любая помощь будет принята с благодарностью.

<Window x:Class="PrintTabs.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:PrintTabs"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="500">
<Grid>
    <Grid x:Name="MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="54"/>
            <RowDefinition Height="93"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid x:Name="Header">
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Content="Header" Grid.Row="0"></Label>
            <Button x:Name="PrintThis" Content="Print" Width="100" HorizontalAlignment="Right" Click="PrintMe" />
        </Grid>
        <Grid x:Name="Info" Grid.Row="1">
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Label Content="Content:" Grid.Row="0"/>
        </Grid>
        <TabControl x:Name="tabControl" Margin="0,10,0,0" Grid.Row="2">
            <TabItem>
                <TabItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Tab1" FontSize="20" FontWeight="Bold" />
                    </StackPanel>
                </TabItem.Header>
                <Grid x:Name="Tab1Grid">
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Label Content="some stuff"></Label>
                </Grid>
            </TabItem>
            <TabItem>
                <TabItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Tab2" FontSize="20" FontWeight="Bold" />
                    </StackPanel>
                </TabItem.Header>
                <Grid x:Name="Tab2Grid">
                    <Grid.RowDefinitions>
                        <RowDefinition x:Name="fieldHeader" Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Label Content="some more stuff"></Label>
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Grid>

private void PrintMe(object sender, System.Windows.RoutedEventArgs e)
    {

        PrintDialog print = new PrintDialog();

        if (print.ShowDialog() == true)
        {

            for (int i = 0; i < 2; i++)
            {
                this.tabControl.SelectedIndex = i;
                print.PrintVisual(this.MainGrid, "Report");
            }


        }
    }

Запрошенные выходные изображения

tab1 resulttab1 result

результат tab2 tab2 result

1 Ответ

0 голосов
/ 18 декабря 2018

Ожидание Task.CompletedTask, как я предложил в комментариях, не будет работать.Я проверил сгенерированный код конечного автомата и увидел, что когда задание возвращается в завершенном состоянии, конечный автомат переходит к следующему шагу без уступок.

Мне неизвестно о готовой задаче, которая запускаетсяв неполном состоянии и каким-то образом автоматически переходит в завершенное состояние, не имея предварительно определенного времени.Хитрость заключается в том, чтобы заставить проверку конечного автомата завершиться неудачно, прежде чем таймер установит задачу как завершенную, чтобы он выполнял, но не ждал слишком долго, чтобы вы теряли время.По мере того, как аппаратное обеспечение становится лучше, сегодня может быть недостаточно времени.

Если есть лучший способ или механизм, такой как описанный мной, я приветствую лучший ответ.

private async Task PrintMe(object sender, System.Windows.RoutedEventArgs e)
{
    PrintDialog print = new PrintDialog();

    int savedSelectedIndex = this.tabControl.SelectedIndex;

    if (print.ShowDialog())  // == true is redundant; don't do that.
    {
        for (int i = 0; i < this.tabControl.Items.Count; i++)
        {
            this.tabControl.SelectedIndex = i;

            // Allow the UI to update by yielding to the message loop
            // or whatever it is that controls the UI thread.
            await Task.Delay(100);

            print.PrintVisual(this.MainGrid, "Report");
        }
    }

    // And of course, "be kind, rewind"
    this.tabControl.SelectedIndex = savedSelectedIndex;
}

Обратите внимание, что в цикле теперь используется tabControl.Items.Count вместо жесткого кодирования количества вкладок.Это поможет с обслуживанием, если вы когда-нибудь измените количество вкладок.

Теперь, когда PrintMe равно async, вам придется иметь дело с этим в восходящем направлении.Отсутствие контекста - это столько советов, сколько я могу вам дать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...