Sprechblasen-Control

  • WPF

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von julian2704.

    Sprechblasen-Control

    Hallo VBP-Forum,
    ich weiß die Überschrift ist schlecht gewählt. Wenn ich einen besseren Begriff finde, ändere ich sie auch um.
    ich möchte eine Chat erstellen. Momentan läuft dieser noch über PHP/MySQL (Dodos MySQLLib 3), auf TCP steige ich noch um. Da mir aber kein Server für die Server-Konsolenanwendung zur Verfügung steht, bin ich auf diese Variante ausgewichen.
    Wie auch immer. Ich möchte, wenn ich jetzt die Nachrichten abfrage, jede Nachricht als Item in einem StackPanel anzeigen lassen.
    Jetzt stehe ich aber vor folgendem Problem.

    Ich möchte jetzt die Nachrichten so anzeigen lassen, wie bspw. in der Nachrichten-App von Windows 8.
    Sprich, dass die Nachricht in einer Sprechblase angezeigt wird.
    Zweitens möchte ich zudem, dass wenn sich die Größe des Fensters ändert, die "Sprechblasen" nur eine bestimmte Maximalbreite bekommen, welche auf der StackPanel-Breite basiert.
    Also zum Beispiel, dass die Sprechblase eine dynamische Breite von nur 3/4 der StackPanel-Breite bekommt.

    Ich hoffe, ihr könnt mir helfen.

    Vielen Dank im Voraus
    Julian
    Du brauchst keine Vorlage, die kannst du dir selbst machen.
    Stark vereinfachtes Beispiel:

    XML-Quellcode

    1. <Window>
    2. <Window.Resources>
    3. <ControlTemplate TargetType="{x:Type ListBoxItem}" x:Key="ItemTemplate">
    4. <Grid x:Name="ItemMainContent" ContextMenu="{StaticResource WHContextMenu}" Height="60" ClipToBounds="True">
    5. <TextBlock Text="{Binding Path=MessageText}" Foreground="#FFFFFFFF" />
    6. </Grid>
    7. </ControlTemplate>
    8. <Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
    9. <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    10. <Setter Property="Template" Value="{StaticResource ItemTemplate}"/>
    11. </Style>
    12. </Window.Resources>
    13. <Grid>
    14. <ListBox Name="listBox1" BorderThickness="0" ItemContainerStyle="{StaticResource ContainerStyle}" />
    15. </Grid>
    16. </Window>
    Das sieht schonmal gut aus - danke.
    Nur mir fehlt noch das kleine abstehende "Dreieck", welches ich noch bräuchte.
    Ich muss mal experimentieren, wahrscheinlich wird's dann ein Stackpanel als Template mit einem Path und dem TextBlock.

    Bis dahin aber schonmal vielen Dank !

    (Wer mir noch bei Problem 2, der automatischen Breitenanpassung helfen kann, der möge dies bitte noch als Antwort zu diesem Beitrag schreiben)
    Aso soll das also nicht so aufpoppen wie bei skype z.b.?
    Naja dann ist das wie bereits gesagt nen einfaches template.
    Für das dreieck kannst du z.b. ne polyline, path oder was auch immer machen.
    (Falls du expressionblend hast würde sich auf das dafür gut anbieten)

    EDIT:
    Hab dir noch schnell in Expressionblend so nen teil zusammengeschustert (nur als Beispiel damit du nen anhaltspunkt hast):


    XML-Quellcode

    1. <Window
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:ec="http://schemas.microsoft.com/expression/2010/controls"
    5. xmlns:ee="http://schemas.microsoft.com/expression/2010/effects"
    6. x:Class="TestWPF.MainWindow"
    7. x:Name="Window"
    8. Title="MainWindow"
    9. Width="824" Height="587">
    10. <Grid x:Name="LayoutRoot">
    11. <Grid Height="120">
    12. <Grid.RowDefinitions>
    13. <RowDefinition Height="*"/>
    14. <RowDefinition Height="30"/>
    15. </Grid.RowDefinitions>
    16. <Rectangle RadiusX="10" RadiusY="10" Stroke="#FF000000"/>
    17. <Path Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" HorizontalAlignment="Left" Margin="30,-1.6,0,0" Width="20" Grid.Row="1"
    18. Data="M22.166642,154.45381 L29.999666,187.66699 40.791059,154.54395"/>
    19. <Grid Margin="10">
    20. <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Mein Text ist hier"/>
    21. </Grid>
    22. </Grid>
    23. </Grid>
    24. </Window>

    EDIT2: Wieso zur hölle formatiert es das zeug immer so hässlich? Wenn ichs einfüge ist es immer mit zeilenumbrüchen! sorry.
    Ok das ist neu wenn ich das zeug ausm windows-editor kopiere gehts :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „thefiloe“ ()

    Bitte VB-Tag benutzen - aber richtig

    @Samus:
    ich seh sowas ganz oft, dass jmd. einen Style macht, und im Style dann ein Template zuweist.
    Warum nicht gleich das Template dem ItemTemplate zuweisen, und die Stylerei überspringen?

    Ich mag Styles nicht so, weil man da im Setter immer alles mögliche reinschreiben kann, ohne dass der Xaml-Designer Bindings oder annere Syntax-Geschichten überprüfen kann.

    ErfinderDesRades schrieb:

    Würdest du zu Ende lesen, hättest du gelesen, dass ich nix machen kann. Hab jetzt aber ne Lösung gefunden. Wie gesagt GoogleChrome und VisualStudio und Expressionblend + dieses Forum vertragen sich einfach nicht. Ich kopiere das alles richtig rein und beim absenden steht auch alles richtig da, nur wird dann jede Formatierung rausgehauen. Aber nochmal für alle falls noch jemand das Problem hat: Einfach in Windows Editor kopieren :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @EDR: Weil ich so direkt den FocusVisualStyle auf x:Null setzen kann, weil ich im Code, aus dem der XAML-Ausschnitt stammt, noch viel mehr stehen hab, unter anderem eigene Styles für die verschiedenen Zustände, wie z.B. fokussiert.
    nagut, wo du das rausgenommen hast, weißich ja nicht.
    Ah - und wenn es wirklcih erforderlich ist, dem ListboxItem ein ControlTemplate zu verpassen, dann geht das nicht anners, denn übers die ItemTemplate-Zuweisung legt man DataTemplates fest.

    Allerdings wäre genau das (DataTemplate statt ControlTemplate) in diesem Falle glaub günstiger, denn einem DataTemplate ist das Viewmodel bekannt, und daher kann man Bindings mit Designer-Unterstützung setzen.
    mit Xaml-Designer meine ich auch nicht das Vorschau-Fenster, sondern das Property-Fenster. Da hat man die Möglichkeit "Databinding übernehmen" als Property anzuklicksen, und bekommt einen sehr hilfreichen Dialog, um ein Binding zu konfigurieren. Der dazugehörige Code wird stantepede ins Xaml eingefügt.
    @Samus
    @thefiloe

    Vielen Dank für das Template. Expression Blend habe ich leider nicht. Kennt jemand noch eine Alternative (möglichst kostenlos) ?
    Ich setze mich jetzt erstmal aber mit MVVM auseinander, habe ich noch nicht gemacht.

    EDIT: Falls jemand noch eine Idee mit der dynamischen Breite hat, bitte unter diesen Beitrag schreiben.