Laden...

Forenbeiträge von dila71 Ingesamt 103 Beiträge

11.06.2020 - 08:50 Uhr

Wie immer, kaum gepostet findet man doch recht schnell selbst die Lösung.

Falls jemand anderes das gleiche Problem hat, die Lösung ist die Eigenschaft

IsHyphenationEnabled

des Textblocks auf

true

zu stellen. (entweder im Textblock selber oder über den Style)
Klappt prima solange wenigstens der Platz für die Silbe da ist, wird eine normale Silbentrennung verwendet.

Gruß
DiLa

11.06.2020 - 07:58 Uhr

Hallo,
leider hat mir die Suchfunktion nicht so recht weiter geholfen.
Ich suche nach einer Möglichkeit einem Text in einem Textblock mögliche "Sollbruchstellen" für den TextWrap zu verpassen.

Was meine ich damit:
Wenn ich einen Textblock habe:


<TextBlock
    Grid.Row="0"
    Grid.Column="1"
    Style="{StaticResource ColumnHeaderCell}"
    Text="ULS& #10;Festigkeitsnachweis" />

dann habe ich bei meiner normalen Bildschirmgröße als Ausgabe:

ULS
Festigkeitsn
achweis

Füge ich einen Trennstrich ein "Festigkeits-nachweis", dann sieht es ganz gut aus:

ULS
Festigkeits-
nachweis

Mache ich jetzt aber das Fenster kleiner dann habe ich das Ergebnis:

ULS
Festigkeit
s-
nachweis

Meine Frage, gibt es eine Möglichkeit einer Markierung zu setzen, wo wenn nötig eine Trennung erfolgen soll?
Beispiel: $ als angenommenes Markierungszeichen welches von einem Trenner ersetzt wird

<TextBlock
    Grid.Row="0"
    Grid.Column="1"
    Style="{StaticResource ColumnHeaderCell}"
    Text="ULSS& #10;Fes$tig$keits$nach$weis" />

Danke
DiLa

15.04.2020 - 14:01 Uhr

Hallo Abt,
vielen Dank für Deine Antwort.

Diese hat mich dazu gebracht den Fehler nicht bei mir zu suchen und siehe da, die eigene Responseklasse funktioniert.

Das Problem war, dass ich das Ganze über eine durch eine Bibliothek erstellte Swagger-Doku getestet habe. Diese speichert das Ganze zwischen und wenn man dann von dort die Datei lädt und speichert kommt Mist raus.
Den Webservice direkt ansprechen und das Ergebnis speichern funktioniert prima.

Falls mal wer nach ner Lösung sucht, obiges funktioniert.

15.04.2020 - 08:31 Uhr

Hallo,
Was will ich: Ich will Daten an einen C# Webservice übergeben, ein Word als MemoryStream erzeugen und ausliefern.
Was habe ich: Alles bis auf das Ausliefern.
Was ist mein Problem?
Ich habe 2 Lösungsansätze versucht.

  1. Ansatz
    Wie unter https://www.c-sharpcorner.com/article/sending-files-from-web-api/ beschrieben, habe ich mir (statt der dort verwendeten class eBookResult) eine Klasse WordResult geschrieben.

public class WordResult : IHttpActionResult
{
    readonly MemoryStream _wordContent;
    readonly string _wordFileName;
    readonly HttpRequestMessage _httpRequestMessage;

    public WordResult(MemoryStream data, HttpRequestMessage request, string filename)
    {
        _wordContent = data;
        _httpRequestMessage = request;
        _wordFileName = filename;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        _wordContent.Position = 0;
        var httpResponseMessage = _httpRequestMessage.CreateResponse(HttpStatusCode.OK);
        httpResponseMessage.Content = new StreamContent(_wordContent);
        httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = _wordFileName };
        httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        return Task.FromResult(httpResponseMessage);
    }
}

Wird verwendet in meiner API-Methode:


[HttpPost]
public async Task<IHttpActionResult> CalculateAndExport([NotNull] EvaluationExportParameters parameters)
{
     //hier die Worderzugung als MemoryStream dataStream
     return new WordResult(dataStream, Request, "DocumentName.docx");
}

Ergebnis: Wenn ich den Service über swagger aufrufe, bekomme ich eine Worddatei zum Download angeboten, Word sagt mir jedoch, dass die Datei beschädigt sei.
Füge ich an den Anfang der ExecuteAsync Methode


_wordContent.Position = 0;
using (var file = new FileStream(_wordFileName, FileMode.Create, System.IO.FileAccess.Write))
    _wordContent.CopyTo(file);

ein, bekomme ich in meinem bin/Debug Verzeichnis eine Datei welche ich öffnen kann und die auch den richtigen Inhalt hat.
Unterschied, die Datei im bin/Debug Verzeichnis ist 45Kb, die im Download 77Kb.

  1. Ansatz:
    Wie unter https://iditect.com/faq/pdf/pdf-document-to-webapi-for-download.html unter Answer für ein Pdf beschrieben, wäre meine API-Methode:

[HttpPost]
public async Task<IHttpActionResult> CalculateAndExport([NotNull] EvaluationExportParameters parameters)
{
    //hier die Worderzugung als MemoryStream dataStream

    var content = new StreamContent(dataStream);
    content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName = "DocumentName.docx"};
    content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
    content.Headers.ContentLength = dataStream.GetBuffer().Length;
    return Ok(content);
}

Ergebnis:
statt eines downloadbaren Files bekomme ich als Response nur ein JSON Konstrukt:


{
  "Headers": [
    {
      "Key": "Content-Disposition",
      "Value": [
        "attachment; filename=Stellungnahme.docx"
      ]
    },
    {
      "Key": "Content-Type",
      "Value": [
        "application/octet-stream"
      ]
    },
    {
      "Key": "Content-Length",
      "Value": [
        "48468"
      ]
    }
  ]
}

Kann mir wer auf die Sprünge helfen, wo ich mich zu blöd anstelle?
Ist einer der beiden Ansätze überhaupt zielführend?

Vielen Dank
Dila

15.08.2019 - 21:19 Uhr

Danke für Die Antworten.

Hier nochmal zur Erklärung:
Ich habe existierenden Code.
In einer Klasse (Welche eine Excelzeile abbildet) gibt es eben das erwähnte ValueProperty vom Typ SValue.
Der Urheber (nicht verfügbar) scheint damit sicherstellen zu wollen, dass da eben nur die 3 möglichen Werte drin sein können.

Beim Excelexport (bereits fertig und ebenfalls nicht von mir) wird ValueProperty.Get() in ins Excel geschrieben und das ist eben wie bereits gesagt 0.2 wenn ValueProperty mit SValue.eS02 belegt ist.

Meine Aufgabe ist jetzt ein ExcelImport wo dann eben aus den Werten 0.2, 0.25 und 0.38 eben wieder die EnumValues entstehen müssen.

Aus Euren Antworten schließe ich, dass ich wohl irgendwo eine ExtensionKlasse übersehen habe und da das Get() implementiert ist.
Meine ursprüngliche Annahme war, dass man doch irgendwie ein Enum mit Double Werten machen kann und ich es nur nicht kenne bzw. mich zu blöd anstelle.

Nochmals Danke ´

15.08.2019 - 19:09 Uhr

Hallo,
ich habe im Code (Verursacher nicht greifbar 😉 ) folgende enum.


public enum SValue
    {
        /// <summary>
        /// 0.2
        /// </summary>
        eS02,

        /// <summary>
        /// 0.25
        /// </summary>
        eS025,

        /// <summary>
        /// 0.38
        /// </summary>
        eS038
    }

Natürlich gibt es auch ein Property ValueProperty (≤ Beispielnamen), welches von diesem Typ ist.

Wenn nun


ValueProperty = SValue.eS02; 

dann liefert:


ValueProperty.Get() => 0.2

Ich dachte bisher Double Enums gäbe es nicht.
Google sagt auch nur, geht nicht.
Nach was kann/muss ich googeln, um mich darüber zu informieren.

Meine eigentliche Aufgabe inportiere einen Striing in dieses Property,
natürlich nicht den String eS038, wäre ja zu einfach... (SValue)Enum.Parse(typeof(SValue), "eS038");
nee "0,38" soll es sein.

Danke im Voraus für die Hilfe

30.01.2019 - 12:00 Uhr

Hallo,
ich habe folgendes Datagrid:

<DataGrid x:Name="tagsGrid" ItemsSource="{Binding}" GridLinesVisibility="Vertical" AlternatingRowBackground="#C3DDE5" 
                             AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                             SelectionUnit="Cell" SelectionMode="Extended" BorderThickness="3" RowStyle="{StaticResource RawTagDataGridRow}">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="TagName" Header="Tag" Width="*" KeyboardNavigation.TabIndex="1"
                                    Binding="{Binding Mode=TwoWay, Path=RawTag.TagName, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"
                                    ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}" />
                <DataGridTextColumn x:Name="TagCycle" Header="Cycle" KeyboardNavigation.TabIndex="2"
                                    Binding="{Binding Mode=TwoWay, Path=RawTag.Cycle, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" 
                                    ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}"/>
                <DataGridTextColumn x:Name="TagSource" Header="Source" Width="*" KeyboardNavigation.TabIndex="3"
                                    Binding="{Binding Mode=TwoWay, Path=RawTag.Source, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"
                                    ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}"/>
                <DataGridTextColumn x:Name="Unassigned" Header="unassigned" Width="*" KeyboardNavigation.TabIndex="4"
                                    Binding="{Binding Mode=OneWay, Path=RawTag.Unassigned, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=False}"
                                    ElementStyle="{StaticResource ResourceKey=textBlockUnassignedStyle}"/>
                <DataGridTemplateColumn x:Name="editTagColumn" Header="" CanUserResize="True" KeyboardNavigation.TabIndex="5">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <WrapPanel>
                                <Button x:Name="btnTagDelete" Click="BtnTagDelete_Click" CommandParameter="{Binding}" Height="15" Width="15" Margin="2">
                                    <Button.Content>
                                        <Image Source="../Resources/delete.png"></Image>
                                    </Button.Content>
                                </Button>
                            </WrapPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

der verwendete RawTagDataGridRow - Style sieht folgendermaßen aus:

 <Style x:Key="RawTagDataGridRow" TargetType="{x:Type DataGridRow}">
        <Setter Property="FontSize" Value="16"/>
        <Setter Property="FontFamily" Value="ArialMT"/>
        <Setter Property="Height" Value="Auto"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="true" >
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="IsEnabled" Value="True" />
                <Setter Property="ValidationErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid>
                                <Border BorderBrush="red" BorderThickness="1" Background="#11FF0000" Opacity="0.5" IsHitTestVisible="False" x:Name="errorBorder"/>
                                <Ellipse Width="12" Height="12" Fill="Red" Stroke="Black" StrokeThickness="0.5"/>
                                <TextBlock FontWeight="Bold" Padding="4,0,0,0" Margin="0" VerticalAlignment="Top" Foreground="White" Text="!" ToolTip="{Binding RawTag.GetAllErrors}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="false" >
                <Setter Property="ToolTip" Value="{x:Null}"/>
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="BorderBrush" Value="Green"/>
                <Setter Property="IsEnabled" Value="True" />
                <Setter Property="ValidationErrorTemplate" Value="{x:Null}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

der verwendete textBlockErrStyle - Style

<Style x:Key="textBlockErrStyle" TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="false" >
                <Setter Property="ToolTip" Value="{x:Null}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="true" >
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="Background" Value="Red" />
                <Setter Property="Foreground" Value="White" />
                <Setter Property="ToolTip" >
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource SimpleErrorConverter}">
                            <Binding Path="." RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}" />
                            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridCell}" Path="Column"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

die im Viewmodel enthaltene Instanz Klasse RawTag implementiert INotifyDataErrorInfo

public Dictionary<string, List<string>> ErrorList = new Dictionary<string, List<string>>();
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

     
        public void NotifyErrorsChanged(string propertyName)
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }

        public bool HasErrors
        {
            get
            {
               return ErrorList.Count > 0;
            }
        }

        public void AddError(string propertyName, string error)
        {
            if (ErrorList.ContainsKey(propertyName))
            {
                if (!ErrorList[propertyName].Contains(error))
                {
                    ErrorList[propertyName].Add(error);
                }
            }
            else
            {
                ErrorList[propertyName] = new List<string>() { error };
            }

            NotifyErrorsChanged(propertyName);
        }

        public void RemoveError(string propertyName)
        {
           if (ErrorList.ContainsKey(propertyName))
            {
                ErrorList.Remove(propertyName);
                NotifyErrorsChanged(propertyName);
            }
        }

        public IEnumerable GetErrors(string propertyName)
        {
            ErrorList.TryGetValue(propertyName, out List<string> errorsForName);
            if (propertyName != "GetAllErrors")
            {
                OnPropertyChanged("GetAllErrors");
            }
            return errorsForName;
        }

        public string GetAllErrors
        {
            get
            {
                if (!HasErrors)
                {
                    return null;
                }

                int count = 1;
                var errorString = "Errors:";
                foreach (var e in ErrorList)
                {
                    e.Value.ForEach(v => errorString += Environment.NewLine + count++ + ". " + v);
                }
                return errorString;
            }
        }

die letzte Methode wird für den Tooltip der Row genutzt.
In den Properties wird das Interface verwendet, Bsp:

 public string TagName
        {
            get => tagName;
            set
            {
                if (value == tagName)
                {
                    return;
                }
                tagName = value;
                RemoveError("TagName");
                if (TagName.Contains(";"))
                {
                    AddError("TagName", "TagName may not contain the character ';'.");
                }
                if (TagName.Trim().Equals("?"))
                {
                    AddError("TagName", "'?' is not a valid value for TagName");
                }

                OnPropertyChanged();
            }
        }

Nun zu meinem Problem:

  1. Ich gehe in Zeile 1 in das Feld TagName und gebe ein ';' ein => die Zeile wird rot umrandet (wie im Style vorgegeben), das Ausrufezeichen laut Style erscheint, der Tooltip für die Zeile wird angezeigt. ≤ Gut, soll so sein
    2.a) Ich bleibe in Zeile 1 im Feld TagName und lösche das ';' => die Zeile wird nicht mehr rot umrandet (wie im Style vorgegeben), das Ausrufezeichen laut Style verschwindet, der Tooltip für die Zeile wird nicht mehr angezeigt. ≤ Gut, soll so sein
    2.b.1) Ich korrigiere nicht und verlasse das Feld TagName (egal ob in eine andere Zelle in der gleichen Zeile oder Wechsel in andere Zeile) => die Zelle wird zusätzlich rot hinterlegt und bekommt auch einen Tooltip ≤ Gut, soll so sein
    2.b.2) Ich gehe wieder in Zeile 1 in's Feld TagName und lösche das ';' => die Zeile bleibt rot umrandet, das Ausrufezeichen laut Style verschwindet nicht, der Tooltip für die Zeile wird weiter angezeigt. ≤ Schlecht
    2.b.3) Ich verlasse das Feld TagName (egal ob in eine andere Zelle in der gleichen Zeile oder Wechsel in andere Zeile) => die Zelle wird nicht mehr rot hinterlegt und hat auch keinen Tooltip mehr≤ Gut, soll so sein Die Zeile wird aber weiterhin als Fehlerhaft markiert (rot umrandet, Ausrufezeichen, Tooltip) Schlecht

Ich habe keine Ahnung, wo ich noch schauen kann.
Was habe ich vergessen / übersehen?

Viele Grüße und vielen Dank
Dirk

26.01.2019 - 11:49 Uhr

Hallo trashkid2000,

das Height="Auto" hat nur meinen Problem, dass bei fester Breite und einem
TextWrapping="Wrap" sich keine Reaktion gezeigt gehabt.

Die automatische Größenanpassung habe ich jetzt auch hin bekommen, habe sie aber wieder ausgebaut, da es einfach arschlangsam war.
Ich kann gern am Montag mal meinen Code dazu posten (mit VisualTreeHelper, um das von Dir angesprochene Problem

Nur weiß ich nicht, wegen Popup und Visual Tree, ob Du da an die Controls ohne weiteres rankommst... zu lösen).

Grüß und schönes Wochenende
Dirk

24.01.2019 - 12:42 Uhr

Als Doku, falls jemand auf das gleiche Problem stößt:
ich musste der

<ComboBox
        x:Name="ControlCombo"...

ein

Height="Auto"

geben.
Entweder haben Comboboxen von allein eine feste Höhe oder irgendwo oberhalb habe ich die (unbewusst) fest verankert.

Gruß
Dirk

23.01.2019 - 11:40 Uhr

Hallo,

danke für die Tips.
Irgendwie stelle ich mich zu doof an.
Als Step 1 habe ich erst mal der der Spalte des DataGrid in dem mein Control enthalten ist eine feste Breite zugewiesen.
Der Textbox habe ich TextWrapping="Wrap" zugewiesen, beim Grid im ControlTemplate die Hight entfernt.

Nun wird der Text darin zwar nach der Breite umgebrochen aber die Textbox wird nicht höher.
wenn ich dem Control "von außen" eine Height="150" zuweise wird die Zeile im DataGrid höher, mein (ohne Aufklappen) sichtbarer Teil des Controls wird in der Zeile vertikal zentriert dargestellt aber mit gleicher Höhe, wie vor meinen Änderungen.

Ich sehe keinen Grund warum die Textbox mit umgebrochenen Inhalt nicht ihre Höhe ändert?
Hat jemand einen Tip?

Danke
Dirk

21.01.2019 - 12:17 Uhr

Vorweg, ich habe keine Ahnung ob eine solche Manipulation überhaupt möglich ist.

Ich habe folgendes UserControl


<UserControl x:Class="ConfigTool.Controls.TextWithSuggestionControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             >
    <ComboBox
        x:Name="ControlCombo"  
        SnapsToDevicePixels="True"
        OverridesDefaultStyle="True"
        ScrollViewer.HorizontalScrollBarVisibility="Auto"
        ScrollViewer.VerticalScrollBarVisibility="Auto"
        ScrollViewer.CanContentScroll="True"
        IsSynchronizedWithCurrentItem="True"
                           >
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Label MouseUp="SuggestionMouseDown" Content="{Binding}" HorizontalAlignment="Stretch"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>

        <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>


        <ComboBox.Template>
            <ControlTemplate TargetType="ComboBox">
                <Grid >
                    <ToggleButton x:Name="ToggleButton" 
                                  IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                                  Focusable="false"                           
                                  ClickMode="Press" HorizontalContentAlignment="Left" >
                        <ToggleButton.Template>
                            <ControlTemplate>
                                <Grid Height="18">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="18"/>
                                    </Grid.ColumnDefinitions>
                                    <Border x:Name="Border" 
                                            Grid.ColumnSpan="2"
                                            CornerRadius="2"
                                            Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=Background}"
                                            BorderBrush="Black"
                                            BorderThickness="1,1,1,1" />
                                    <Border x:Name="BorderComp" 
                                            Grid.Column="0"
                                            CornerRadius="2" 
                                            Margin="1" 
                                            Background="White"
                                            BorderBrush="Black"
                                            BorderThickness="0,0,0,0" >
                                        <TextBox  Name="Box" Text="{Binding Path=Value,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
                                                  Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=Background}"  
                                                 />
                                    </Border>
                                   
                                    <Path x:Name="Arrow"
                                          Grid.Column="1"     
                                          Fill="Black"
                                          HorizontalAlignment="Center"
                                          VerticalAlignment="Center"
                                          Data="M 0 0 L 4 4 L 8 0 Z"/>
                                </Grid>
                            </ControlTemplate>
                        </ToggleButton.Template>
                    </ToggleButton>
                    <Popup x:Name="suggestionPopup"
                           Placement="Bottom"                        
                           AllowsTransparency="True" 
                           Focusable="False"  
                           IsOpen="{TemplateBinding IsDropDownOpen}"
                           PopupAnimation="Slide">
                        <Grid Name="DropDown"
                              SnapsToDevicePixels="True"  
                              MinWidth="{TemplateBinding ActualWidth}"
                              MaxHeight="{TemplateBinding MaxDropDownHeight}">
                            <Border x:Name="DropDownBorder"
                                    BorderThickness="1" 
                                    Background="White"
                                    BorderBrush="Black"/>
                            <ScrollViewer HorizontalContentAlignment="Stretch" 
                                Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="{Binding}">
                                <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                            </ScrollViewer>
                        </Grid>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasItems" Value="false">
                        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                    </Trigger>
                    <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ComboBox.Template>
    </ComboBox>
</UserControl>

Das Ganze stellt sich als eine Mischung aus Textbox und ComboBox dar, bei der ich über eine Dependency Property festlegen kann, ob beim Click auf einen Vorschlag aus der "Combobox" der Text der Textbox ersetzt oder durch Anhängen ergänzt wird.

Wie man sich vorstellen kann, kann beim "Anhängen" das alles recht lang werden, so dass das DataGrid in dem ich das Control verwende ebenfalls immer breiter wird.

Darum möchte ich folgendes implementieren.
Im Popup x:Name="suggestionPopup" befindet sich ja das StackPanel welches meine "Vorschläge" enthält. Ich würde gern die Breite der TextBox Name="Box" maximal auf die doppelte Länge des längsten Vorschlags setzen, danach soll die Textbox umbrechen und sich mehrzeilig darstellen.

Meine Fragen dazu:

  1. Geht solch eine Dynamik überhaupt?
  2. Ich suche nicht nach einer fertigen Lösung sondern nach Tips wonach ich am besten googeln soll, da ich keinen Ansatz habe wie so etwas geht und worüber ich mich informieren muss. "width manipulation of own usercontrol" scheint doch etwas zu unspezifisch.

Vielen Dank für Stichworte und Hilfe.

Gruß
Dirk

18.01.2019 - 15:15 Uhr

Die Lösung ist:

 <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>
18.01.2019 - 10:17 Uhr

Hallo,
nachdem ich bei meiner letzten Frage über den Scrollviewer gestolpert bin, glaube ich wieder an diesem zu scheitern, weiß aber nicht wie ich es besser machen kann.

Ich brauche eine Art Combobox, die aber beim Selektieren einige "spezielle" Verarbeitungen macht. Darum habe ich mir ein eigenes Control geschrieben.
Hier mein XAML-Code:

<ComboBox.ItemTemplate>
            <DataTemplate>
                <Label MouseUp="SuggestionMouseUp" Content="{Binding}" HorizontalAlignment="Stretch"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
        <ComboBox.Template>
            <ControlTemplate TargetType="ComboBox">
                <Grid >
                    <ToggleButton x:Name="ToggleButton" 
                                  IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                                  Focusable="false"                           
                                  ClickMode="Press" HorizontalContentAlignment="Left" >

<!-- ausgeschnitten, da der Teil funktioniert -->

                    </ToggleButton>
                    <Popup Name="Popup"
                           Placement="Bottom"                        
                           AllowsTransparency="True" 
                           Focusable="False"  
                           IsOpen="{TemplateBinding IsDropDownOpen}"
                           PopupAnimation="Slide">
                        <Grid Name="DropDown"
                              SnapsToDevicePixels="True"  
                              MinWidth="{TemplateBinding ActualWidth}"
                              MaxHeight="{TemplateBinding MaxDropDownHeight}">
                            <Border x:Name="DropDownBorder"
                                    BorderThickness="1" 
                                    Background="White"
                                    BorderBrush="Black"/>
                            <ScrollViewer Name="myScroller"  Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="{Binding}" >
                                <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                            </ScrollViewer>
                        </Grid>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasItems" Value="false">
                        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                    </Trigger>
                    <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ComboBox.Template>

Mein Problem ist nun, dass ich die Labels im <DataTemplate> nicht auf die volle Breite bekomme, so dass, wenn ich bei kurzen Einträgen hinter den Text klicke, zwar das Popup schließt aber nicht mein MouseUp="SuggestionMouseUp" ausgelöst wird, da ich ja außerhalb des Labels klicke.

Den Scrollviewer entfernen kann ich nicht, dann kann ich nur die Labels im initialen Popup sehen und nicht scrollen.
Ich habe schon ein Dock- statt Stackpanel verwendet, bekomme es da aber nicht gebacken die Labels untereinander anzuordnen.

Wie kann ich also die Labels mit linksbündigem Text auf volle breite stretchen, wobei das popup die breite des längsten Elementes annehmen soll?

Danke
Dirk

15.01.2019 - 10:32 Uhr

Weg geschmissen läuft... DANKE

13.01.2019 - 19:13 Uhr

Als Erstes, Sorry, dass ich mich jetzt erst melde, kam gestern irgendwie nicht online.

@witte

Es gibt ja eigentlich keine 5. Spalte, nur wird eben der leere Platz hinten nach der Buttonspalte als solche dargestellt. DIE SOLL WEG.

@Daimonion1980: genau wie witte es geschrieben hat, habe ich es verstanden und will es.
die 2. Spalte DataGridTextColumn x:Name="TagCycle" soll auf Auto nehmen soviel sie braucht, ebenso soll die letzte also 4. Spalte DataGridTemplateColumn x:Name="editTagColumn" nehmen was sie braucht, die 1. und 3. Spalte sollen sich den kompletten restlichen Platz einvernehmen und 1/2 zu 1/2 teilen, so dass es keine 5. Spalte mehr gibt.

Gruß
Dirk

11.01.2019 - 16:01 Uhr

Hallo,
ich habe folgenden Code:

<Grid>
        <ScrollViewer x:Name="tagsGridScrollViewer" HorizontalScrollBarVisibility="Auto" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
            <DataGrid x:Name="tagsGrid" ItemsSource="{Binding}" ScrollViewer.PanningMode="None" 
                            AlternatingRowBackground="LightBlue" AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                            SelectionMode="Single" BorderThickness="3" SelectionChanged="DataGrid_SelectionChanged" RowStyle="{StaticResource errorRowStyle}">                            
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="TagName" Header="Tag name" Binding="{Binding Mode=TwoWay, Path=RawTag.TagName, UpdateSourceTrigger=PropertyChanged}" /> 
                    <DataGridTextColumn x:Name="TagCycle" Header="Cycle" >
                        <DataGridTextColumn.Binding>
                            <Binding Path="RawTag.Cycle" NotifyOnValidationError="True" Mode="TwoWay">
                                <Binding.ValidationRules>
                                    <local:CycleValidationRule></local:CycleValidationRule>
                                </Binding.ValidationRules>
                            </Binding>
                        </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                    <DataGridTextColumn x:Name="TagSource" Header="Source" Binding="{Binding Mode=TwoWay, Path=RawTag.Source}"></DataGridTextColumn>
                    <DataGridTemplateColumn x:Name="editTagColumn" Header="">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <WrapPanel>
                                    <Button x:Name="btnTagDelete" Click="BtnTagDelete_Click" CommandParameter="{Binding}" Height="15" Width="15" Margin="2">
                                        <Button.Content>
                                            <Image Source="../Resources/delete.png"></Image>
                                        </Button.Content>
                                    </Button>
                                </WrapPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </ScrollViewer>
    </Grid>

Ich bekomme alle Spalten als hätte ich Width="auto" gesetzt und eine 5. leere Spalte.

Das Problem an welchem ich mir die Zähne ausbeiße, ich will, dass die Summe der Spalten volle Breite ergibt indem ich die 1. und die 3. Spalte auf "nimm Dir was Du bekommen kannst" also auf Width="*" setzen.

Setze ich das aber, dann sind die 1. und 3. Spalte nicht maximal breit sondern so breit wie die letzte mit dem Button. Eine feste Breite Width="200" o.ä. klappt.

Was verstehe ich an * falsch?

Vielen Dank im Voraus.
Gruß
Dirk

09.10.2018 - 16:05 Uhr

DANKE, DANKE, DANKE

Gerade das "ein Framework ist getestet" Thema ist eben das, warum ich, auch für ein Konstrukt welches man auch einfach mit:


using (StreamReader sr = new StreamReader("..."))
{
    int ignoreLines = 2;
    int lineCounter = 0;

    string line;

    while ((line = sr.ReadLine()) != null)
    {
        lineCounter++;
        if (lineCounter > ignoreLines)
        {
....

lösen kann, nach einem Framework gesucht habe.

Danke an alle

Dirk

09.10.2018 - 12:00 Uhr

Hallo,
nach einiger Googelei habe ich einige Bibliotheken zum Thema CSV einlesen gefunden.

Bei allen kann man eigentlich sagen, Header true/false.

Nun habe ich aber eine Datei in folgendem Aufbau (gegeben ich kann es nicht beeinflussen)


Datensatzbezeichnung
Datum;Zeit;Wert
01.01.2018;20:15;678
02.01.2018;17:54;478
.....

Kennt Jemand ein Framework bei dem ich angeben kann:
Das ist die Quelle (ok, das können alle)
lies (nur) Zeile 1 in Variable x und lies ab Zeile 3 Objekte in Variable y

oder eben lies mit Header ab Zeile 2.

Im Notfall kann ich es auch selber programmieren, aber dry, warum etwas coden wenn es schon ein Framework gibt

Viele Dank
Diek

30.03.2017 - 15:41 Uhr

Datenbanksystem MSSQL
Hallo,

ich habe folgendes Problem.
Ich habe in einer Tabelle ein Decimal-Feld. Nun sollen da nachträglich alphanumerische Werte auch zugelassen sein. Kein Problem denke ich:

ALTER TABLE tabelle ALTER COLUMN spalte nvarchar(255)

Klappt super.
Nun habe ich die Werte kontrolliert und allles ist in Exponentialschreibweise umgewandel worden.
Stand vorher da 1234567890 drin, dann steht jetzt 1.23456e+009 drin.

Zum Glück habe ich es auf einer Testinstanz gemacht.

Kann ich das vermeiden und wenn ja wie?

Danke für Eure Hilfe

15.06.2016 - 10:38 Uhr

Hallo Coffeebean,
als erstes Danke für das einfügen der von mir vergessenen Formatierungen.
Also... ich habe eine Tabelle mit 3 festen führenden Spalten und einem horizontal scrollbarem "rechten Teil".
Durch das

<div style="overflow-x: scroll;  margin-left:Summe der festen Spaltenbreiten; ">

ist die Scrollbar aber IM FENSTER unten am scrollbarem Teil der Tabelle, die Browserscrollbar ist nicht vorhanden.
Wenn ich nun eine Tabelle mit x-hundert Zeilen habe und die erste Zeile nach rechts scrollen will muss ich erst nach unten scrollen, dann die Tabelle horizontal verschieben und dann wieder nach oben.
Das möchte der User nicht. Er möchte den (horizontalen) Browserscroller benutzen, auch wenn er ganz oben in der Tabelle ist.

Ich hoffe das war verständlicher.

Danke und viele Grüße
Dirk

14.06.2016 - 12:55 Uhr

Hallo,
ich habe folgende Aufgabe:
Eine sehr breite Tabelle mit 3 feststehenden ersten Spalten.

Lösung:
die ersten drei Spalten bekommen per css-Klasse

position: absolute;
width: feste Breite;
left: 0; (bzw. Summe der vorangegangenen Spalten)

um die ganze Table dann ein div

<div style="overflow-x: scroll;  margin-left:Summe der festen Spaltenbreiten; ">

Das ganze funktioniert prima, nur ist der Nutzer jetzt am quitschen, dass ja wenn er 300 Zeilen hat der Browser den Scrollbalken unten an die Tabelle "pinnt", er hätte es gern, dass der vertikale Browser-Scrollbalken da und nutzbar ist.

Nehme ich das div weg, ist der Scroller wie gewünscht aber auch die 3 ersten Spalten scrollen mit.

Kennt jemand eine Lösung?

Danke und viele Grüße
Dirk

13.04.2016 - 06:22 Uhr

Hallo,

ja genau um diese Sortvariablen geht es.
ich glaube ich habe jetzt meinen Fehler gefunden. Ich habe in der Funktion getSortType mir einfach mal das Ergebnis von:
Nutzer[0].Vertraege['Gebiet 1'][0].Ende und
Nutzer[0].Vertraege[0][0].Ende zurückgeben lassen.
Ersteres funktioniert, beim zweiten ist Nutzer[0].Vertraege[0] schon undefined.

Nun gut, ich muss den Key statt dem Insex verwenden.
Da bin ich aber wieder bei dem Problem der Anführungszeichen. Im Javascript geht ja Vertraege['Gebiet 1'] aber im HTML?

ng-click="sortType = 'SORTTYPENAME'; sortReverse = !sortReverse"

Die "" sind belegt von ng-click = "..."
Die '' sind belegt von sortType = '...'

Was kann ich also machen, wenn ich innerhalb von SORTTYPENAME für Gebiet 1 nochmals Zeichen brauche?

Danke Dirk

12.04.2016 - 18:00 Uhr

Hallo Abt,
als erstes Danke für die Antwort.
Englisch, Deutsch, Begriffe... ja, richtig. Habe mir die Mühe gemacht, meinen Code zu kürzen und das was nicht zur Frage gehört raus zu schmeißen, dabei ist dann wohl auch beim "eindeutschen" einiges schief gegangen.

Nun aber zum Thema.
Deinen Tip:

Implementiert die Sortierlogik in den Code und lass es aus der View raus.
In er View solltest Du es dann eher verwendet wie ng-show=IsVisible(<parameters>)

verstehe ich nicht so recht?

Ist:

<tr ng-repeat="nutzer in nutzers | orderBy:sortType:sortReverse">

nicht genau dafür da? Dann muss ich doch auch den sortType bestimmen.

Da ich nicht weiß, wieviel "Gebiete" ich habe, kann ich ja auch schlecht für jedes der 4 Felder der beiden einzelnen Verträge im Gebiet eine Sortierfunktion machen.

Nein ich will nicht widersprechen, ich will nur Deine Antwort verstehen 😃

Gruß
Dirk

12.04.2016 - 13:43 Uhr

Hallo,
ich habe folgendes Problem und KEINE Ahnung ob das überhaupt geht.

Ich habe eine Liste von Nutzern. diese Nutzer haben Verträge diese Verträge gehören zu Gebieten. die beiden umsatzstärksten Verträge / Gebiet sollen mit Ihrem Auslaufdatum angezeigt werden.
In der Serverrückgabe bekomme ich eine Liste von Nutzern und eine Liste der in den Nutzern vorhandenen Gebiete.
so ergibt sich die folgende Struktur:


{
	Gebiete:{
		'Gebiet 1',
		'Gebiet 2',
		'Gebiet 3'

	},
	Nutzer:{
		'Name': 'Nutzer 1',
		'Vertraege': {
			'Gebiet 1': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			},
			'Gebiet 2': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			},
			'Gebiet 3': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			},
			...
		}
	},
	{
		'Name': 'Nutzer 2',
		'Vertraege': {
			'Gebiet 1': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			},
			'Gebiet 2': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			},
			'Gebiet 3': {
				{
					'Ende': Datum,
					'Volumen': Volumen
				},
				{
					'Ende': Datum,
					'Volumen': Volumen
				}
			}
			...
		}
	},
	...
}

Die Anzahl der Nutzer und der Gebiete ist dynamisch/unbekannt.
Beides speichere ich in eine gleichnamige Variable im $scope.

Das ganze soll in eine Tabelle die (Excelbeispiel) so aussehen soll: siehe Anhang
Die Tabelle habe ich hin bekommen mit nem Repeater im Repeater.


<table>
    <thead>
        <tr>
            <td></td>
            <th colspan="4" ng-repeat="gebiet in gebiete">
                {{gebiet}}
            </th>
        </tr>
        <tr>
            <td>
                <a ng-click="sortType = 'Name'; sortReverse = !sortReverse">
                    Name
                    <span ng-show="sortType == 'Name' && !sortReverse" class="fa fa-caret-down"></span>
                    <span ng-show="sortType == 'Name' && sortReverse" class="fa fa-caret-up"></span>
                </a>
            </td>
            <td ng-repeat-start="gebiet in gebiete">
                <a ng-click="sortType = '{{getSortType(gebiet, 0, 0)}}'; sortReverse = !sortReverse">
                    Ende 1
                    <span ng-show="sortType == '{{getSortType(gebiet, 0, 0)}}' && !sortReverse" class="fa fa-caret-down"></span>
                    <span ng-show="sortType == '{{getSortType(gebiet, 0, 0)}}' && sortReverse" class="fa fa-caret-up"></span>
                </a>
            </td>
            <th>
                <a ng-click="sortType = '{{getSortType(gebiet, 0, 1)}}'; sortReverse = !sortReverse">
                    Volumen 1
                    <span ng-show="sortType == '{{getSortType(gebiet, 0, 1)}}' && !sortReverse" class="fa fa-caret-down"></span>
                    <span ng-show="sortType == '{{getSortType(gebiet, 0, 1)}}' && sortReverse" class="fa fa-caret-up"></span>
                </a> 1
            </th>
            <th>Ende 2</th>
            <td ng-repeat-end>Volumen 2</td>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="nutzer in nutzers | orderBy:sortType:sortReverse">
            <td style="white-space: nowrap">
                <div ng-bind="nutzer.Name" />
            </td>
            <td ng-repeat-start="vertrag in nutzer.Vertraege">
                <div ng-bind="vertrag[0].Ende" />
            </td>
            <td>
                <div ng-bind="vertrag[0].Volumen" />
            </td>
            <td>
                <div ng-bind="vertrag[1].Ende" />
            </td>
            <td>
                <div ng-bind="vertrag[1].Volumen" />
            </td>
        </tr>
    </tbody>
</table>

Die Anzeige funktioniert prima

Mein Problem ist die Sortierung.
Die Sortierung nach <a ng-click="sortType = 'Name'... funktioniert prima.
Da sich ja sortType = 'Name' auf nutzer.Name bezieht habe ich mir die Funktion getSortType(gebiet, 0, 0) geschrieben, welche mir dann _Vertraege[a]**.c[/i] zurück giebt, da ich ja nutzer.Vertraege[0][0].Ende an dieser Stelle als Sorttype haben will.
a ist dabei der Index von gebiet in Gebiete (in der Hoffnung, dass die Reihenfolge gleich der im Nutzer ist)
b ist 0 oder 1 (je nachdem welchen Vertrag ich haben will)
und c ist 0=Ende oder 1 = Volumen
zuerst hatte ich versucht statt des Indexes in a den key zu verwenden, aber da gingen mir dann schnell die unterschiedlichen einfachen' bzw doppelten" Anführungszeichen aus.

Nun die entscheidende Frage (denn obiges funktioniert NICHT), kann man überhaupt so tief verschachtelt sortieren? und wenn ja, wie komme ich dann an den orderBy:-Parameter?

Danke für die Geduld beim Lesen und DANKE für die Mühe der Hilfe.

Dirk

03.04.2016 - 16:08 Uhr

Hallo Abt,
vielen Dank für die Antwort.
Dass es mit Angular nux zu tun hat, war mir klar (wenn auch sicher dumm von mir formuliert) es ging bei der Erwähnung nur darum, dass ich die Tabellen eben in einer "for each ähnlichen Schleife" erzeuge und sie somit vom Code her alle gleich sind.

Was ich eigentlich suchte war eine Antwort auf die Frage, kann ich die Breiten der Spalten mehrerer Tabellen so verknüpfen, dass die Breiteste den Ausschlag gibt. Habe jetzt erst mal mit festen prozentualen Breiten gearbeitet.

Gruß und nochmals Danke
Dirk

02.04.2016 - 21:25 Uhr

Hallo Abt,
abgesehen von der class="table"ist da nix drin.

  <uib-accordion close-others="false" ng-repeat="gebiet in gebiete">
            <uib-accordion-group heading="{{gebiet}}>
                <table class="table" style="width: 100%; padding: 4px">
                    <thead>
                    <tr>
                        <th>Nummer</th>
                        <th>Name</th>
                        <th>Datum</th>
                        <th>Volumen</th>
                        <th>Kommentar</th>
                    </tr>
                    </thead>
                    <tbody>
                        <tr ng-repeat="vertrag in vertraege[gebiet]">
                            <td>
                                {{contract.Number}}
                            </td>
                            <td>
                                {{contract.Name}}
                            </td>
                            <td>
                                {{contract.EndString}}
                            </td>
                            <td>
                                {{contract.Volume}}
                            </td>
                            <td>
                                {{contract.Comment}}
                            </td>
                        </tr>
                    </tbody>
                </table>
            </uib-accordion-group>

und bei gleich langen Einträgen ist die Namensspalte unterschiedlich lang.
aber eben nur so 1-2 Ausreißer bei 15 Gebieten

Gruß
Dirk

01.04.2016 - 18:30 Uhr

Hallo,

ich habe in AngularJS ein AccordeonUI
Die Header sind kein Problem, und der Inhalt der Contentbereiche auch nicht.
Mein problem ist folgendes:
In den Contentbereichen sind Tabellen... immer die gleichen.
Nun hätte ich es schon gern, dass die Spalten der Tabellen in allen Accordeon Bereichen gleich breit sind. Meistens sind sie das auch aber so 1 bis 2 von 15 sind ohne erkennbaren Grund anders.

Da ich die Header und den Content (die Tabellen) mit ng-repeat erzeuge ist am Code alles gleich.
Der Inhalt sieht auch gut aus nur dass eben manchmal eine Menge Platz (anscheinend Grundlos) drin ist.

Hat wer ne Idee wie ich dem zu Leibe rücken kann?`

Danke und viele Grüße
Dirk

28.03.2016 - 14:48 Uhr

hallo,

nach langem Suchen (man findet 1000-Scheiß) habe ich jetzt auch selbst eine Lösung gefunden:

<tr>
    <th>irgendwas </th>
    <th>Anderes </th>
    <th>in</th>
    <th>der</th>
    <th>Zeile</th>
    <td ng-repeat-start="portfolio in portfolios">a</td>
    <th>b</th>
    <th>c</th>
    <td ng-repeat-end>d</td>
</tr>

funktioniert prima.
Anhand des Stichwortes ng-repeat-start gehe ich davon aus, dass es die gleiche Lösung ist.

Danke

28.03.2016 - 07:58 Uhr

Hallo,
ich habe folgendes Problem, ich muss eine Tabelle erstellen mit unbekannter Spaltenanzahl.
Kein Problem eigentlich, wenn der Kopf nicht 2 Zeilig wäre.

|irgendwas Anderes in der Zeile|             A              |             B              |
|irgendwas Anderes in der Zeile|   a  |   b  |   c  |    d  |   a  |   b  |   c  |    d  |

A, B, .... sind dabei dynamisch,
a, b, c, d je erster Zelle sind immer fest.

A, und B habe ich hin bekommen, indem ich

<th colspan="4" ng-repeat="portfolio in portfolios">
    {{portfolio}}
</th>

verwendet habe

Nun die Frage, wie wiederhole ich die Zellenfolge

<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>

so oft wie Elemente in portfolios sind?

Vielen Dank im Voraus
Dirk

28.03.2016 - 07:41 Uhr

Nochmal Danke, das war die Lösung, der Updater hat Mist gebaut, Neuinstallation inklusive Update war nicht schön aber hilfreich.

24.03.2016 - 12:50 Uhr

Sorry vergessen, VS 2015 -- und vielen Dank für den Tip.

24.03.2016 - 09:09 Uhr

Hallo,
Vorgestern beging ich den Fehler für mein VS Update 1 zu installieren.

Seitdem habe ich in einem WP 8.1 Projekt folgendes Problem:

Ich habe ein ResourceDictionary für meine Styles.
darin habe ich z.B. folgende Elemente:


    <Style x:Key="Logo" TargetType="Image">
        <Setter Property="Source" Value="/Assets/AssetImages/Logo.png"/>
    </Style>

    <Style x:Key="SettingIcon" TargetType="BitmapIcon">
        <Setter Property="UriSource" Value="/Assets/AssetImages/icn_settings HD.png"/>
    </Style>

Seit dem Update bekomme ich für alle BitmapIcon die Fehlermeldeung:> Fehlermeldung:

Specified method is not supported

dabei ist Value und sein Inhalt blau (NICHT rot) unterkringelt. Ich kann weder auf dem Emulator noch auf dem Device starten.
Es liegt nicht an einem Leerzeichen im Namen der Datei, denn es ist bei ALLEN BitmapIcon-Styles, aber eben NUR bei denen.

Kennt jemand das Problem

Vielen Dank
DiLa

01.12.2015 - 10:15 Uhr

Des Rätsels Lösung war ganz einfach.
IDRef gibt es nicht.
IDREF sehr wohl

01.12.2015 - 08:35 Uhr

Hallo,

ich versuche ein Facet über ein IDREF zu erstellen.

	<xsd:simpleType name="autorRefTyp" >	
		<xsd:restriction base="xsd:IDRef">
			<xsd:pattern value="A[0-9]{6}"/>
		</xsd:restriction>
	</xsd:simpleType>

dieses führt aber zur Fehlermeldung in der Überschrift.

Was mache ich falsch?
Kann ich auf ein IDREF kein Facet legen?

Danke und viele Grüße

05.11.2015 - 08:14 Uhr

Hallo,

ich habe folgendes Problem in einer Universal-App.
Ich habe eine ApBar in einer eigenen Farbe:

 <Page.BottomAppBar>
        <CommandBar ClosedDisplayMode="Compact" Background="{StaticResource AppBarColor}">
.....

diese anthält Button, welche statt der System Symbole eigene Bilder zeigen

 
<AppBarButton>
    <AppBarButton.Icon>
        <BitmapIcon  Style="{StaticResource FilterIcon}"/>
    </AppBarButton.Icon>
</AppBarButton>

Vorteil: Die Button zeigen weiße symbole auch wenn ich den Button drücke.
Nachteil: Sie bekomme ich garstige Farbe als Background bei gepressten Buttons.

Einige Googelei brachte das Resultat:
Ich muss die Foreground Eigenschaft setzen. Erläuterungen waren auch recht verstädlich warum.
Gesagt, getan:

 <Page.BottomAppBar>
        <CommandBar ClosedDisplayMode="Compact" Background="{StaticResource AppBarColor}" Foreground="{StaticResource AppBarColor}">
.....

Funktioniert: ich habe jetzt den Hintergrund immer in AppBarColor
NACHTEIL: Nun habe ich eine AppBar, mit blauen Buttons auf blauem Grund.

Hat jemand einen Tip

Danke und Gruß
Dirk

29.10.2015 - 19:58 Uhr

Ich bin immer wieder beeindruckt wie Usern Faulheit unterstellt wird.
Ja, klar erst suchen.

Von der deutschen Version Deiner ersten Antwort hatte ich die Info F und G

Manchmal stellt man sich aber einfach zu brätzig an und kommt nicht auf das eine richtige Wort in der Suche und findet dann die eine richtige Seite wie die 2. die Du gepostet hast eben trotz Suche nicht.

Darum vielen Dank für Deine Antwort die Du verfasst hast trotz Deiner Meinung, ich hätte nicht zuerst gegoogelt.

Viele Grüße
Dirk

29.10.2015 - 19:24 Uhr

ich muss ein Datum formatieren
"F" = Donnerstag 29.Oktober 2015 19:18:45
"G" = 29.10.2015 19:18:45

Ich brauche aber eine Mischung
OHNE Donnerstag (so wie G) aber mit Monatsnamen (wie F)

Gibts da nen Standardformatierer oder muss ich den selber bauen?

Danke und viele Grüße
Dirk

27.10.2015 - 12:12 Uhr

nach einigem Suchen scheint PointerCaptureLost die Lösung zu sein.

Danke an alle die versucht haben zu helfen

27.10.2015 - 08:17 Uhr

@ muhtanten:
Danke, aber wird laut Intellisense nicht unterstützt.
Ebenso wie MouseLeftButtonUp was eigentlich auch von UIElement geerbt sein müsste und (MouseLeftButtonUp Occurs when the finger is lifted off of a UIElement) ja genau das wäre, was ich suche.

@parso:
passiert 😉

26.10.2015 - 20:06 Uhr

???
Reden wir aneinander vorbei oder versteh ich Deine Antwort nicht?

Der RepeatButton feuert doch das Click-Event hintereinander weg im Abstand des Delays, solange er gedrückt bleibt. Also muss ich doch nur raus bekommen das wievielte Mal er das Event grade feuert.

Der Code müsste natürlich noch etwas angepasst werden:


private void Click(object sender, RoutedEventArgs e)
        {
            if (counter < 3)
                {
                    wert += 10;
                    counter++;
                 }
            else if (counter < 6)                
                {
                    wert += 20;
                    counter++;
                 }
            else
                {
                     wert += 50;
                    counter++;
                 }
        }

Nun suche ich nach einem Weg diesen Zähler zurück zu setzen, wenn der Button losgelassen wird, denn wenn er los gelassen wird, soll der Mechanismus ja von neuem beginnen.

Viele Grüße
Dirk

26.10.2015 - 14:31 Uhr

Hallo,

ich habe folgende Anforderung für Windowsphone umzusetzen.
Ein Button, den man gedrückt halten kann.

  1. und 2. Sekunde gedrückt => Wertveränderung um 10.
      1. Sekunde gedrückt => je Sekunde Wertänderung um 20.
        ab 6. Sekunde gedrückt => Wertänderung um 50.

Mein Ansatz, ein RepeatButton mit einem Delay von 1000.
einen Counter der in der Klickmethode hoch gezählt wird.


private void Click(object sender, RoutedEventArgs e)
        {
            if (counter < 3)
                wert += 10;
            else if (counter < 6)
                wert += 20;
            else
                wert += 50;
        }

Den Counter wollte ich reseten, wenn ich ein "release"-event bekomme aber weder PointerReleased noch KeyUp werden auf dem Emultor beim loslassen des Buttons ausgelöst.

  1. Welchen Event könnte ich denn nehmen?
  2. Gibt es eine bessere Lösung als einen RepeatButton?

Viele Grüße und Danke im Voraus
Dirk

26.10.2015 - 14:17 Uhr

Danke für die Antwort, aber ich verstehe sie nicht.

Ich nehme die Designvorlage skaliere sie auf 1920 Höhe (1080 x 1920).
Dann packe ich den scale-240 Button daneben, er hat die gleiche Größe wie in der Designvorlage.
Ich starte den Emulator, zoome den bei einer 1080 Auflösung auf gleiche Höhe und auch hier ist der Button wenn ich es neben die Designvorlage packe gleich groß.

Ich nehme die Designvorlage skaliere sie auf 800 Höhe (480 x 800).
Dann packe ich den scale-100 Button daneben, er hat die gleiche Größe wie in der Designvorlage.
Ich starte den Emulator, zoome den bei einer WVGA Auflösung auf gleiche Höhe und ... der Button ist größer.

Wie im 2. Fall auch für 1280 und WXGA.

Bei physischen Geräten üwrde ich ja auch evtl den Fehler beim Device suchen.
Beim Emulator sage ich aber... hm, scheine ich mich zu dumm anzustellen. Wenigstens da sollte es doch klappen.

22.10.2015 - 09:47 Uhr

Hallo,
ich habe folgendes Problem:
Unser Designer macht eine Vorlage 480 x 800. Darin ist ein Bild sagen wir als Beispiel 100 * 100 px.
Dieses schneidet er aus benennt es image.scale-100.png, er skaliert es auf 140140 nennt es image.scale-140.png und skaliert das ursprünkliche nochmal auf 240240 und nennt es image.scale-240.png.

Ich nehme die 3 Bilder und verwende sie in meinem WP 8.1 Projekt

<Image Style="{StaticResource ImageStyle}" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center"/> 

und in der Styledatei:

<Style x:Key="ImageStyle" TargetType="Image">
        <Setter Property="Source" Value="/Assets/image.png"/>
</Style>

Starte ich im Emulator auf "Emulator 8.1 1080p 5.5 /6 Inch" ist das Bild so groß wie es sein soll.
auf "Emulator 8.1 780p 7.7 Inch", "Emulator 8.1 WXGA 4.5 Inch", "Emulator 8.1 WXGA 4 Inch" und "Emulator 8.1 WVGA 4 Inch" ist das Bild zu groß. Es ist aber überall um den selben Betrag zu groß.

Meine erste Idee, es wird das falsche Bild angezeigt. Lösche ich aber das scale-100, dann habe ich z.B. im WVGA gar kein Bild also gehe ich davon aus, dass der WVGA Emulator auch das richtige Bild bvenutzt.

Hat wer nen Tip, wonach ich nochmal schauen lkann?

Danke und viele Grüße
Dirk

21.10.2015 - 16:36 Uhr

Alles super, ich habe es hin bekommen.
Die Lösung war ganz einfach.> Fehlermeldung:

Invalid object name 'dbo.AccessGroupEntities

Was sagt das? Dass eine Tabelle gesucht wird die wie der Plural meiner Klasse heißt.
Das mappen auf einen Tabellennamen (meine Klasse heißt AccessGroupEntity die Tabelle t_accessGroups) war Schuld.
Nachdem ich das raus geschmissen hatte, wurde bei einer neuen Migration automatisch aus t_accessGroups die Tabelle AccessGroupEntities entsprechend dem Kassennamen und schon ging alles ohne dass ich was geändert habe.

Warum das Identity EntityFramework nicht mit den Möglichkeiten des EntityFrameworks selber zusammen arbeiten will...

Gruß
Dirk

20.10.2015 - 15:59 Uhr

Hallo Abt,
ich sage nicht, dass es nicht geht, ich sage ich habe keine andere Idee als das was ich versucht habe.
Dass das was ich versucht habe keine GUTE Idee ist, schließe ich aus meinen Schwierigkeiten und Deiner Antwort auf meinen ursprünglichen Post.

Viele Grüße
Dirk

20.10.2015 - 15:17 Uhr

Ja, Microsofts eigenen Kram zu erweitern, mach ich wenn es geht auch meist einen Bogen drum.

Ich habe aber bei der Anforderung: Nutzer haben Zugriffsgruppen, Projekte haben Zugriffsgruppen und Nutzer haben Zugriff auf die Projekte die die gleiche Zugriffsgruppe haben, keine Idee wie man das anders abbilden könnte außer über diese Beziehung.

Gruß
Dirk

20.10.2015 - 14:22 Uhr

Hallo,
ich bin an einer kleinen Projektverwaltung.
Dabei sollen eingeloggte Usern Zugriffsgruppen zugewiesen werden. ebenso den Projekten.
Bei einer m:n Beziehung hat ja nun jede Klasse eine Collection vom Typ der anderen Klasse.

Zwischen ProjectEntity-Klasse (verweist auf die Tabelle t_projects) und AccessGroupEntity (verweist auf die Tabelle t_accessGroups) lief alles prima. gegenseitig Collections hinzu gefügt, in den EntityTypeConfiguration angegeben HasMany... alles Schick, Kreuztabelle wurde erstellt ich kann erzeugen, lesen, ändern ...

Die Klasse AcessGroup ist eine Entität in meiner Entitäten-dll auf welche die Web-Anwendung verweist.
Somit war es kein Problem, dass ApplicationUser auf AccessGroup zu verweisen.
Da man ja aber keine Zirkelreferenz haben will, hatte ich das Problem, dass meine AccessGroup den ApplicationUser nicht kannte.
Aus diesem Grund habe ich EF Identity der Entitäten-dll hinzugefügt, und aus meinem Web-Projekt die Klassen ApplicationUser und ApplicationDbContext in meine Entitäten-dll verlagert und dem ApplicationUser eine ICollection<AccessGroupEntity> AccessGroups hinzugefügt.

Ich habe eine neue Migration gemacht.
In der DB wurde auch eine Kreuztabelle zwischen AspNetUser und t_accessGroups angelegt.
Wenn ich aber versuche über den ApplicationUser auf seine ICollection<AccessGroupEntity> AccessGroups auf die AccessGroups zuzugreifen bekomme ich den Fehler

Fehlermeldung:
[SqlException (0x80131904): Invalid object name 'dbo.AccessGroupEntities'.]

Ja, die Tabelle heißt ja auch nicht so.

Ich habe keine Idee wo ich ansetzen kann.

Hat jemand nen Tip?

Viele Grüße und Danke im Voraus
Dirk

12.10.2015 - 13:13 Uhr

Danke, hat super geklappt

12.10.2015 - 11:22 Uhr

Hallo,
ich habe folgendes Stück Code:

if (!decimal.TryParse(BudgetString, NumberStyles.Float, new CultureInfo("de-DE"), out budget))
                {
                   //Behandle den Formatfehler
                }

5000,00 klappt (ich komme nicht in den if-Block und budget ist 5000.00)
5.000,00 klappt nicht (sprich ich komme in den if-Block und budget ist 0)

Tausche ich

NumberStyles.Float

gegen

NumberStyles.AllowThousands

funktioniert weder 5000,00 noch 5.000,00.

Was mache ich falsch, wenn ich das ganze explizit für Deutschland bauen will.

Danke und liebe Grüße
Dirk

15.09.2015 - 13:19 Uhr

Danke, hat mir geholfen 😉