Toon posts:

[WPF] Custom venster visueel afgekapt na hoogte aanpassing

Pagina: 1
Acties:

Vraag


  • _Jeffrey_
  • Registratie: Maart 2003
  • Niet online
In een WPF applicatie heb ik een aantal custom vensters, welke feitelijk geen stijl hebben (WindowStyle="None") en waar ik zelf elementen zoals een titelbalk op plaats.
Het betreffende dialoogvenster heeft een ResizeMode = CanResize, en SizeToContent = Height. De Height = "Auto", en er is een MinHeight opgegeven. In het venster staat een expander element, welke na het uitklappen de hoogte van het venster veranderd (de extra content komt er bij). De grid-row waar deze expander in staat heeft een variabele hoogte ("*")

Het probleem is dat na het uitklappen van de expander, de 'extra' hoogte van het venster niet zichtbaar is, en dus visueel wordt afgekapt. Als ik dat venster sleep of er naast klik wordt niet niet-zichtbare deel plots wel zichtbaar.

Lijkt er op dat het venster alleen opnieuw getekend moet worden na het uitklappen van de expander, maar ik krijg dit in deze situatie niet voor elkaar.

De standaard methoden hiervoor zijn Me.InvalidateVisual() en Me.UpdateLayout(), maar dat heeft geen effect.
Google bracht mij op een mogelijke oplossing:
code:
1
2
3
Private Shared EmptyDelegate As Action = Function()
                                             End Function
Me.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, EmptyDelegate)

Maar ook dit werkt niet. Het doet gewoonweg niks. Ook als ik i.p.v. het venster (Me) het 'hoofd'-grid probeer te re-draw-en heeft dit geen effect.

Na testen blijkt dat het .expanded event van de expander al afgevuurt wordt voordat het element werkelijk uitgeklapt is, en dus de redraw te vroeg uit zou voeren. Maak ook als ik een aparte knop op het venster maak welke deze functie uitvoert gebeurt er niks.


Hoe kan ik toch een redraw forceren welke in deze situatie werkt?

Alle reacties


  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Hoe ziet dat venster er uit in XAML?

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • _Jeffrey_
  • Registratie: Maart 2003
  • Niet online
Dit is zo'n beetje de volledige XAML. Ik heb alleen wat stijl-declaraties er uit gesloopt, anders wordt het wel heel veel code.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<Window ResxExtension.DefaultResxName="VerzonnenNaam.windowMessageBox" Language="{UICulture}" 
        x:Class="windowMessageBox"
        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:VerzonnenNaam"
        mc:Ignorable="d"
        UseLayoutRounding="True"
        Title="windowMessageBox" MinHeight="200" Height="Auto" Width="450" WindowStartupLocation="CenterScreen" WindowStyle="None" FontSize="12.5" FontFamily="Segoe UI" AllowsTransparency="True" Background="{x:Null}" ShowInTaskbar="False" SizeToContent="Height">

    <Window.Effect>
        <DropShadowEffect BlurRadius="8" Opacity="0.12"/>
    </Window.Effect>


    <Grid Margin="10">
        <Border Background="white" CornerRadius="4">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="27" />
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="43"/>
                </Grid.RowDefinitions>

                <!-- Border around the window -->
                <Border Grid.RowSpan="2" Grid.ColumnSpan="2" Grid.Row="1" CornerRadius="0,0,4,4" BorderBrush="#9aa3c5" BorderThickness="1,0,1,1" />

                <!-- Grid cell top left -->
                <Border Background="#323540" Grid.Column="0" Grid.Row="0" CornerRadius="4,0,0,0">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Image Source="Images/icons/titleicon_alert.png" Height="15" Width="15" Grid.Column="0" HorizontalAlignment="Center" />
                        <TextBlock x:Name="Textblock_WindowTitle" Foreground="#ddd" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="1">[Title]</TextBlock>
                    </Grid>
                </Border>

                <!-- Grid cell top right -->
                <Border Background="#262830" Grid.Column="1" Grid.Row="0" CornerRadius="0,4,0,0" />

                <!-- Transparent panel for dragging the window (titlebar replacement) -->
                <ContentControl Height="27" VerticalAlignment="Top" Margin="0,0,40,0" Grid.Column="0" Grid.ColumnSpan="2">
                    <StackPanel x:Name="WindowDragPanel" Background="Transparent"/>
                </ContentControl>

                <!-- Close button -->
                <WrapPanel Grid.Column="1" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Top">
                    <Button x:Name="Button_CloseForm" Style="{StaticResource FormCloseButton}" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="40" Height="27">
                        <Image x:Name="Image_CloseForm" VerticalAlignment="Center" HorizontalAlignment="Center" Width="10" Height="10" Source="Images/common/close_button.png" Stretch="Fill"  />
                    </Button>
                </WrapPanel>

                <!-- Container for the general button(s) -->
                <Grid Grid.ColumnSpan="2" Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="1,0,1,1">
                    <Border BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#f9f9f9" CornerRadius="0,0,4,4" />
                    <Border BorderBrush="#ddd" BorderThickness="0,1,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                    <Button Style="{StaticResource GeneralButton}" Name="Button_Ok" Width="100" Height="30" VerticalAlignment="Stretch"  HorizontalAlignment="Center" Content="OK" IsDefault="True" IsCancel="True" />
                </Grid>

                <!-- Main text container -->
                <StackPanel  Grid.ColumnSpan="2" Grid.Row="1" Width="390">
                    <TextBlock x:Name="TextBlock_Message" TextWrapping="Wrap" VerticalAlignment="Stretch" xml:space="preserve" Width="390" MinHeight="100" Padding="0,20,0,20">[Main text]</TextBlock>
                    <Expander x:Name="Expander_AddionalInfo" Visibility="Collapsed" Header="{Resx Text_AdditionalInfo}" Width="auto" Margin="0,10" Template="{DynamicResource ExpanderControlTemplate1}">
                        <TextBlock x:Name="Textblock_AddionalInfo" xml:space="preserve" TextWrapping="Wrap" />
                    </Expander>
                </StackPanel>
            </Grid>
        </Border>
    </Grid>
</Window>


Expander_AddionalInfo heeft nu een visibility met waarde collapsed. Met de code-behind wordt deze zichtbaar gemaakt (en de inhoud er in geplaatst) als er informatie is welke daar zichtbaar moet zijn.

  • _Jeffrey_
  • Registratie: Maart 2003
  • Niet online
*subtiele trap*

Iemand enig idee voor een goede oplossing?

Ondertussen gebruik ik een MacGyver-oplossing door het venster een pixel te verplaatsen en meteen weer terug te plaatsen, maar dit is natuurlijk geen nette oplossing.


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee