WPF - roztažení textu v komponentách pomocí ViewBoxu   zodpovězená otázka

WPF

Ahoj.

Snažím se vytvořit aplikaci, kde by se prvky zvětší podle toho, jak se zvětší okno(tedy celé okno je vyplněno prvky). To není problém - dám si je do gridů, kterým nastavím vertical i horizontal alignment na Stretch.

Problém je, že text v buttonech, textblocích, atd zůstává titěrný i když tlačítko je přes celou obrazovku. Řešení je následující, umístit textové komponenty do viewBoxů:

 <Button  Width="Auto"Height="Auto"  >
                        <Viewbox >
                            <TextBlock>
                               Roztažený a veliký text podle velikosti tlačítka
                            </TextBlock>
                        </Viewbox>
                    </Button>

Takto to funguje bez problémů, avšak při množství elementů to značně zaprasuje celý xaml.

Nejde to udělat nějakým stylem, který by automaticky umístil Content do viewBoxu?

Nebo nějakou vlastní komponentičkou dědící z původních elementů?

Děkuji za případné odpovědi.

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

Proč nedáte jeden ViewBox kolem celého gridu?

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

Protože to nějakým způsobem ruší Stretch.

Například toto:

 <Viewbox>
    <Grid>
      <Button>5</Button>
    </Grid>
</Viewbox>

udělá: http://postimg.org/image/wvtwvgqnv/

Ale já potřebuji aby krom velkého textu v tlačítku se i celé tlačítko roztáhlo, tak jak je to definováno v gridu.

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

Zkuste nastavit Viewboxu Stretch="Fill".

On tam má standardně Uniform, což znamená, že změří, jak by bylo tlačítko velké normálně, a pak ho zvětší, ale zachová poměr stran.

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

To zase udělá trochu jiný nepořádek:

http://postimg.org/image/hjr2n84g5/

Zdeformovaně roztáhne celé tlačítko...

Viewbox pracuje s tím tlačítkem, ale já bych nějakým způsobem potřeboval aby pracoval s jeho obsahem. Třeba i ten okraj je tlustější, což není žádoucí...

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

Aha, tlačítku by se musely nastavit nějaké výchozí rozměry, aby to mělo správný poměr stram.

Každopádně pokud se tlačítko nemá zvětšovat, ale fakt jde jen o ten obsah uvnitř, pak musí být ViewBox v tlačítku a asi se tomu nevyhnete. Jediné, co mě napadá, je přepsat si šablonu tlačítka, aby ten ViewBox dovnitř dávala automaticky.

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

Tak nakonec jsem to udělal pomocí templatu:

 <ControlTemplate TargetType="{x:Type Button}" x:Key="targetButton">
            <Grid   >
                <Rectangle  Fill="{TemplateBinding Background}"  Stroke="{TemplateBinding BorderBrush}"/>
                <Viewbox>
                    <ContentPresenter Margin="2"/>
                </Viewbox>

            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter  Property="Opacity" Value="0.7" />
                    <Setter Property="Foreground" Value="Gray" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <Style TargetType="Button">
            <Setter Property="Template" Value="{StaticResource targetButton}"/>
        </Style>

Včetně nastavení při IsEnable= false.

Potkala mě všad další nemilost a to ta, že Textblock takto udělat nelze (nelze šablonovat).

Udělal jsem si tedy vlastní usercontrol:

<UserControl x:Class="Aplikace.TextBlockStretch"
             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" 
             >
    <UserControl.Style>
        <Style TargetType="{x:Type UserControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type UserControl}" >
                        <Border  Background="{TemplateBinding Background}" >
                            <Viewbox >
                                <TextBlock  Foreground="{TemplateBinding Foreground}">
                                <ContentControl  Content="{TemplateBinding Content}" />
                                </TextBlock>
                            </Viewbox>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Style>

</UserControl>

--jen tak kdyby měl někdo stejnou žádost..

díky za pomoc.

nahlásit spamnahlásit spam 1 / 1 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