WPF, kreslení v OnRender   zodpovězená otázka

WPF

WPF, .NET 4.0

Dobrý den,

měl bych dotaz ohledně kreslení na controly v metodě OnRender.

VS po vložení controlu na window, po změně kódu controlu, před rebuildem, VS vykreslí na control žlutý vykřičník.

Potřeboval bych graficky podobnou funkcionalitu na některé mé controly.

Pokud přepíšu metodu OnRender, u třídy která dědí od UserControl tak se mi grafika mění tak jak chci. Pokud, ale budu dědit od např. Button tak se sice OnRender vykoná, ale vykreslený bude jen ten Button. (Chtěl bych ho částečně překrýt mojí grafikou, nehledě na content nebo style controlu)

Věděl by někdo jak na to ?

př.: na button, který normálně WPF vykreslí

nakreslit obdélník.

    public class TestControl: Button
    {

        public TestControl()
        {
            
        }

        protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
        {

            base.OnRender(drawingContext);
            var rect = new Rect(new Point(0.0, 0.0), new Size(100.0, 100.0));
            drawingContext.DrawRectangle(Brushes.Red, new Pen(Brushes.RosyBrown, 5.0), rect);

        }
    }

Problém je, že obdélník je pod grafikou WPF.

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

Tak vytvořte samostatný control bez vzhledu do kterého vykreslujte a ten zahrňte do šablony tlačítka.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano děkuji, na tomto řešení jsem již zapracoval a je funkční.

Přesto bych měl ještě dotaz.

Mám control, v němž je veřejná vlastnost s privátním setterem.

Původně jsem vytvořil instanci již v konstruktoru controlu, chtěl jsem, aby byly rovnou dostupní členové této vlastnosti.

Př:

public class Ctrl: Control
{

    public Ctrl()
    {
        Connection = new ConnectionDetil();
    }

    public ConnectionDetail Connection { get; private set; }
}

public class ConnectionDetail
{
    public long IndexGroup { get; set; }
    public long IndexOffset { get; set; }
    ...
}

Což v rámci OOP je v pořádku.

Problém nastal ve chvíli kdy jsem chtěl tuto vlastnost nastavovat v designeru Visual Studia.

V jiném tématu jsem se dozvěděl, že musím vytvořit TypeConverter třídy ConnectionDetail, a dát ho jako atribut vlastnosti. Což funguje, ale jen když má vlastnost getter i setter veřejný. A nesmím instanci vytvářet v kódu. Ale buď kliknutím v designeru na tlačítko "New" nebo napsáním příslušného zápisu v XAML.

Pokud má vlastnost privátní setter, tak se zobrazí disablovaný textbox s názvem třídy (což by bylo dobře - instance by byla vytvořená v construktoru), ale nejde rozvinout a nastavovat členy vlastnosti (IndexGroup ...).

Už nějak nevím jak donutit VS, aby zobrazovalo členy instancované vlastnosti.

Např.: Microsoftí controly mají vlastnost margin (což je také třída i když s public přístupy) a nenabízejí nejdřív tlačítko New pro instanci, a až potom dovolí nastavení této vlastnosti.

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