locked
reuable costum control RRS feed

  • שאלה

  • (C# wpf .net 4)

    היי,

    אני מנסה לחשוב על דרך ליצור control שיהיה reusable שכל מה שיהיה בו זה תמונה וטקסט במרכז.
    (מצידי שיהיה style, control template, העיקר שאני אוכל ליצור instansים שלו ב- run time כמה שאני רוצה ולשים אותם על המסך)

    האינטואיציה שלי אומרת שהכי נוח שהוא יהיה ב- resource dictionary, כתוב כ-XAML כבר עם כל הערכים שלו.

    הכי פשוט שחשבתי (וזה גם עובד) זה לקחת textblock ופשוט לשים לו תמונה ב- background ב-fill.
    הבעיה עם זה, זה שהתמונה שלי היא מעגל סימטרי וכשהוא משמש כרקע, הוא מתעוות לאליפסה, חשוב לי שזה ישאר עגול.

    אני לא דואג לגבי כמה טקסט יכנס ב- Control וכד' מאחר והתכנון שלי זה שיהיה שם לא יותר מ-2-3 תווים.

    אני יושב על זה כמה שעות, לא הצלחתי להגיע לפתרון יצירתי שיספק אותי.

    אשמח לעזרה, בתודה מראש.

    יום שני 16 אפריל 2012 16:51

תשובות

  • אם אתה רוצה שהוא ישאר עגול אתה יכול להשתמש ביכולות של ViewBox:

    		<Border BorderThickness="1" BorderBrush="Black">
    			<Grid>
    				<Viewbox Stretch="Uniform">
    					<Ellipse Fill="Red" Width="1" Height="1" />
    				</Viewbox>
    				<TextBlock Text="SomeText" VerticalAlignment="Center" HorizontalAlignment="Center" />
    			</Grid>
    		</Border>
    


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    • סומן כתשובה על-ידי lior.efraim יום שלישי 17 אפריל 2012 09:50
    יום שלישי 17 אפריל 2012 08:00

כל התגובות

  • היי,

    נסה כך:

    א. תיצור class חדש שיורש מ- control, ושיהיה בו OverrideMetadata:

    public class MyControl : Control
    {
    static MyControl()
    {
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl ),
            new FrameworkPropertyMetadata(typeof(MyControl)));
    }
    }

    ב. תוסיף לקונטרול property מסוג string (לצורך העניין MyText).

    ג. ב- resourceDictionary כלשהו (אולי ב- generic.xaml) תייצר לו את ה- template:

    <Style TargetType=local:MyConrtol>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate>
    <!--ellipse comes here with your text like this -->
    <Ellipse>
    <TextBlock Text={TemplateBinding MyText} />
    </Ellipse>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>

    זה צריך לעבוד.

    אסף


    MCPD
    MCTS - TFS 2010
    My Blog: http://benjaminet.wordpress.com

    יום שלישי 17 אפריל 2012 06:29
  • אם אתה רוצה שהוא ישאר עגול אתה יכול להשתמש ביכולות של ViewBox:

    		<Border BorderThickness="1" BorderBrush="Black">
    			<Grid>
    				<Viewbox Stretch="Uniform">
    					<Ellipse Fill="Red" Width="1" Height="1" />
    				</Viewbox>
    				<TextBlock Text="SomeText" VerticalAlignment="Center" HorizontalAlignment="Center" />
    			</Grid>
    		</Border>
    


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    • סומן כתשובה על-ידי lior.efraim יום שלישי 17 אפריל 2012 09:50
    יום שלישי 17 אפריל 2012 08:00
  • היי,

    תודה על הרעיונות - עובד כמו קסם (2 הרעיונות).

    אסף - למרות מה שחשבתי בפוסט הראשוני שלי, אני לא בטוח שאני רוצה לממש custom control (עוד אין מספיק "בשר" בפונקציונאליות שתצדיק) אבל תודה על העזרה! :)

    יום שלישי 17 אפריל 2012 09:47