WPF překrývání controlů   zodpovězená otázka

WPF, Architektura, Grafika

VS2012 Pro, WPF, Frm 4.0

Dobrý den,

mám vlastní control děděný od Button, control obsahuje Grid o třech sloupcích a třech řádcích.

V jedné buňce mám Image, a přes všechny buňky mám ContentPresenter (dále CP).

Potřeboval bych v konkrétní situaci, aby byl vidět jak CP tak i Image.

Problém je, že mi CP vždy překryje celý control.

Zkoušel jsem nastavit u Image a CP Panel.ZIndex, to však nepomohlo.

<Button x:Class="MpControls.PLC.Controls.Buttons.Beckhoff.PlcBeckhoffButton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d" 
        x:Name="ThisCtrl" 
        d:DesighHeight="170"
        d:DesignWidth="390">

    <Grid Width="{Binding Width, ElementName=ThisCtrl}" 
          Height="{Binding Height, ElementName=ThisCtrl}">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="15*" />
            <ColumnDefinition Width="5*" />
            <ColumnDefinition Width="4" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="15*" />
            <RowDefinition Height="5*" />
            <RowDefinition Height="4" />
        </Grid.RowDefinitions>

        <ContentPresenter Grid.RowSpan="3"
                          Panel.ZIndex="2"
                          Grid.ColumnSpan="3"  />
            
        <Image Grid.Column="1"
               Grid.Row="1"
               Panel.ZIndex="1"
               IsEnabled="True"
               x:Name="ImgDisconnected"
               Source="/MpControls;component/Images/Disconnected.png" 
               VerticalAlignment="Bottom"
               Margin="0,0,2,2" 
               HorizontalAlignment="Right" />

    </Grid>

</Button>

Visibility controlu nastavuji zde:

public override void EndInit()
        {
            base.EndInit();

            ...

            ImgDisconnected.Visibility = con ? Visibility.Hidden : Visibility.Visible;

        }

Věděl by někdo kde je chyba ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mno takže jsem asi nepochopil vytváření controlu.

Grid s CP a Image je v mém případě vložený jako content buttonu.

Když nastavím jiný content tak se grid nahradí novým contentem (př. stringem) a původní rozložení zmizí, což na mě působilo jako že se to jen překreslí CP.

Musí se vytvořit styl a ten dát tlačítku to funguje:

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        x:Class="MpControls.PLC.Controls.Buttons.Beckhoff.PlcBeckhoffButton"
        mc:Ignorable="d"
        d:DesignWidth="468" 
        d:DesignHeight="241">
    
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid VerticalAlignment="Stretch"
        					HorizontalAlignment="Stretch">

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="15*" />
                                <ColumnDefinition Width="5*" />
                                <ColumnDefinition Width="4" />
                            </Grid.ColumnDefinitions>

                            <Grid.RowDefinitions>
                                <RowDefinition Height="15*" />
                                <RowDefinition Height="5*" />
                                <RowDefinition Height="4" />
                            </Grid.RowDefinitions>

                    ...

Ale nastal další problém.

V code behind jsem přepisoval metodu "OnIsPressedChanged"

protected override void OnIsPressedChanged(DependencyPropertyChangedEventArgs e)
        {
            base.OnIsPressedChanged(e);
            ...
        }

Po přidání stylu tlačítku, se tato metoda nevolá. Proč ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak odpovím si sám

"

Hi,

you didn't overwrite the ControlTemplate - so the original template is still used and with it all it's triggers.

But: if you overwrite the ControlTemplate, you get rid of all default behaviours, but you have to define the complete layout including all behaviours on your own.

Cheers

Jürgen

"

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback