Guten Morgen,
ja danke für den Wink mit dem Zaunpfahl. Manchmal kann es so einfach sein.
Hallo,
ich habe eine Solution mit einem WPF Projekt, einem Windows Service Projekt und einem Installer der beide Projekte packt.
Die beiden Projekte verwenden jeweils Newtonsoft.Json 13.0.3
Das WPF Projekt hat TargetFramework net7.0-windows
Der Service .NETFramework,Version=v4.8.1
Mein Problem ist, das einmal die Newtonsoft DLL mit dem Ziel net6.0 und einmal mit net45 verwendet werden soll. Beim packen des Installers wird natürlich nur die erste verwendet da jeweils gleicher Dateiname. Das hat zur Folge das mein Projekt nach der Installation zwar läuft aber der Service nicht.
Kann ich das WPF Projekt dazu bringen die .Net Framework Variante zu verwenden ?
Oder ist der Ansatz, die Abhängigkeiten in ein Unterverzeichnis zu verschieben eine Möglichkeit? (Abhängigkeiten (dlls) in Unterverzeichnis der Executable ?)
Hallo Abt,
ich möchte einen Service erstellen der Aufgaben bewältig wie Datenbankverbindungen und Netzwerkverkehr. Zusätzlich soll über eine GUI Grundeinstellungen gemacht werden können die natürlich vom Service genutzt werden.
Im aktuellen Projekt ist beides in einer Solution.
Mein Problem: Ein Service muss installiert werden bevor ich diesen über mein Programm starten kann. Um dies zu tun benötige ich aber eine exe von diesem Service und Installiere sie z.B. mit installutil. Diese wird aber nur kompiliert wenn ich ein Windows Dienst Projekt erstelle. Im Moment bekomme ich als Debug und Release Ausgabe nur die exe der Win Forms Anwendung.
Wie kann ich also diesen Dienst installieren wenn z.B. meine Form das erste mal geöffnet wird ? (Wie ich prüfe ob der Dienst bereits installiert ist weiß ich)
Deine Verlinkung werde ich mir anschauen... Danke
Hallo Community,
ich habe ein Winform Projekt erstellt. Anschließend dem Projekt ein Windows Dienst hinzugefügt.
Entweder wird der Dienst nicht oder direkt in das Programm kompiliert !? Demnach müsste der Dienst wohl als eigenes Projekt realisiert werden. Oder gibt es mittlerweile eine Möglichkeit den Service direkt im GUI Programm mitzuliefern?
Ja das ist so gewollt, die Controls sollen erstmal übereinander liegen und werden später durch Animationen herausbewegt. (So hoffe ich zumindest 😁 ) Deswegen kommt das UniformGrid auch nicht für mich in Frage.
Ja ControlGrid ist überflüssig geworden. Das ist noch ein Überbleibsel aus meinem ersten Versuch mit einem UserControl.
Für das Template funktioniert das mit ItemsControl. Für Style nicht.
Mein Frage scheint erstmal geklärt zu sein. Das ItemsControl führte nun doch zum Erfolg. Die Lösung war das festlegen des ItemsPanel - dieses ist Standard ein StackPanel.
<Style TargetType="local:MyItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:MyItemsControl">
<Grid x:Name="ControlGrid">
<ItemsPresenter/>
<Ellipse x:Name="MainCircle"
VerticalAlignment="Top" HorizontalAlignment="Left"
Width="24" Height="24" Stroke="Black" Fill="Red"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Danke erstmal für eure Information.
Leider sieht es nicht besser aus bei mir. Ich hab nochmal versucht in ein Projekt die verschiedenen Controls zu implementieren.
Ein eigenes Control kommt schon in Frage da ich es später schon in verschiedenen Projekten verwenden möchte. Der Code oben in meinem Test ist etwas unspezifisch. D.h. am Ende soll im Projekt ein oder mehr Button übergeben werden so wie in meinem Bsp. die TextBlock's.
In dem Testcode ist bis jetzt noch nicht berücksichtigt das die hinzugefügten Buttons ein Style vom Control und jeweils ein umschließendes Grid mit einer Animation bekommen sollen. Das Control hat also schon ein wenig was zu tun.
(Zum vorstellen: Am Ende soll es FAST wie ein Floatbutton sein)
Eine Übersicht meiner in Frage kommenden Möglichkeiten als Anhang. Im Grunde ist von der Anordnung her das UserControl das richtige. Nur kann den Controls die später hinzugefügt werden über XAML kein Name vergeben werden. Mach ich das im Control nachträglich, finden angewendete Animationen diesen Namen allerdings nicht.
So kam ich zum CustomControl. Das ContentControl nimmt allerdings nur ein Element auf und das ItemControl listet die Elemente halt wie eine List unpraktikabel untereinander.
Hallo Bhaal,
ItemsControl hört sich erstmal logisch an.
Ich habe meine Dateien wie folgt abgeändert. Es gibt keine Fehler aber auch keine Ausgabe.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyControl">
<Style TargetType="{x:Type local:CustomControlTest}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControlTest}">
<Grid>
<Grid.Resources>
<local:MyData x:Key="dataList"/>
</Grid.Resources>
<Grid x:Name="ContentContainer" ><!--Children="{Binding Source={StaticResource dataList}}"-->
<ItemsControl ItemsSource="{Binding Source={StaticResource dataList}}"/>
</Grid>
<Ellipse x:Name="MainCircle"
VerticalAlignment="Top" HorizontalAlignment="Left"
Width="48" Height="48" Stroke="Black" Fill="Red"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
public class CustomControlTest : ItemsControl
{
MyData listData = new MyData();
Binding binding1 = new Binding();
static CustomControlTest()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControlTest), new FrameworkPropertyMetadata(typeof(CustomControlTest)));
}
public CustomControlTest()
{
binding1.Source = listData;
}
}
public class MyData : ObservableCollection<object>
{
public MyData(){}
}
}
...
<local:CustomControlTest Grid.Row="1">
<TextBlock x:Name="a">Ein sinnloser Text</TextBlock>
<TextBlock x:Name="b">Noch mehr sinnloses</TextBlock>
</local:CustomControlTest>
...
Hallo Leute,
seit Tagen versuch ich mein erstes Control zu erstellen. Die letzten Tage gingen dabei drauf das mit einem UserControl zu machen. Zwischendurch waren auch erfolge dabei aber dafür neu Probleme. Das übliche halt. Am Ende kam ich zu der Erkenntnis das folgendes Konstrukt mit einem CustomControl zu machen ist. Jetzt hab ich soviel über diverse Controls und Templates gelesen das ich den Faden verloren haben.
Ziel:
<Grid>
<Grid x:Name="ContentContainer">
<ContentControl Content="{TemplateBinding Content}"/>
</Grid>
<Ellipse x:Name="MainCircle"/>
</Grid>
Das Grid ContentContainer soll diverse (mehrere) Controls aufnehmen können. Im UserControl hatte ich das lösen können, hier jedoch nicht. Desweiteren steh ich hier noch vor der Frage wie kann ich vom code behind auf ContentContainer zugreifen um die Elemente zu durchlaufen?
Oder ist ein ContentControl doch Falsch? Gelesen hatte ich noch was von ItemControl.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyControl">
<Style TargetType="{x:Type local:CustomControlTest}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControlTest}">
<Grid>
<Grid x:Name="ContentContainer">
<!--<ContentPresenter/>-->
<ContentControl Content="{TemplateBinding Content}"/>
</Grid>
<Ellipse x:Name="MainCircle"
VerticalAlignment="Top" HorizontalAlignment="Left"
Width="48" Height="48" Stroke="Black" Fill="Red"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
//[ContentProperty("Children")]
public class CustomControlTest : ContentControl
{
static CustomControlTest()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControlTest), new FrameworkPropertyMetadata(typeof(CustomControlTest)));
}
public CustomControlTest()
{
//Children = ContentContainer.Children;
}
}
Hi Leute,
Ich habe ein Usercontrol erstellt in dem per Designer ein Button hinzugefügt wurde und per Code eine ListBox. Diese wird sichbar wenn auf den Button geklickt wurde.
Die Eigenschafften der ListBox lege ich in der Load-Methode des CustomControls fest. Unter anderem weise ich dort auch listBox.Paint ein Event zu.
Mein Custom Control funktioniert soweit, nur die Event Methode scheint nicht angesprungen zu werden.
Folgendes hab ich probiert:
private void CustomControl_Load(object sender, EventArgs e)
{
Debug.WriteLine("CC Load");
listBox.Height = ItemHeight * MaxItems;
listBox.BorderStyle = BorderStyle.None;
listBox.BackColor = this.BackColor;
listBox.Paint += PaintBorderEvent; // UND das: listBox.Paint += new PainEventHandler(Border);
}
private void Border(object sender, PaintEventArgs e)
{
Debug.WriteLine("CC Border");
}
void PaintBorderEvent(object sender, PaintEventArgs e)
{
Debug.WriteLine("CC PaintBorderEvent");
}
Die Debug Meldungen werden nie ausgeführt. Hab ich noch irgendwas vergessen?
Ok, sorry hab des Rätsels Lösung,
In Form1_Paint hab ich DrawBorder mit e.ClipRectangle aufgerufen. Besser ist wohl für den 2 Parameter 'ClientRectangle')
Ich habe ein Control erstellt in welchem mit Rectangles rumgemalt wird. Das Steuerelement funktioniert soweit auch und wird bei jedem FormBorderStyle richtig angezeigt.
ABER, wenn ich um mein Form ein Rahmen haben möchte, dann mach ich das mit DrawBorder in der Form1_Paint. Und genau dann wird um mein Control der selbe Rahmen gezeichnet - was echt unschön ist.
Hat jemand eine Idee wie ich das verhindern kann ?
using System;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
using System.Diagnostics;
namespace ExperimentalControl
{
public partial class MeinControl : UserControl
{
FileInfo f;
Rectangle contentRectangle = Rectangle.Empty;
Point[] pts2 = new Point[4];
Rectangle controlBounds = Rectangle.Empty;
private string activeText = "ON";
private string inActiveText = "OFF";
public MeinControl()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
//InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
controlBounds = e.ClipRectangle;
e.Graphics.ResetClip();
this.MinimumSize = new Size(93, 30);
this.MaximumSize = new Size(135, 51);
DrawIOSStyle(e);
base.OnPaint(e);
}
private void DrawIOSStyle(PaintEventArgs e)
{
this.BackColor = Color.Transparent;
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
Rectangle rectControl = new Rectangle(0, 0, this.Width, this.Height);
contentRectangle = rectControl;
if (!isMouseMoved)
{
if (this.ToggleState == ToggleButtonState.ON)
ipadx = this.contentRectangle.Right - (this.contentRectangle.Height - 3);
else
ipadx = 2;
}
//Rectangle rectToggleButton = new Rectangle(ipadx, r.Y, r.Height - 5, r.Height);
Rectangle rectToggleButton = new Rectangle(ipadx, rectControl.Y, rectControl.Height, rectControl.Height);
Rectangle rectActiveMirroring = new Rectangle(this.Width / 6 - 10, this.Height / 2, (this.Width / 6 - 10) + (rectToggleButton.X + rectToggleButton.Width / 2), this.Height / 2);
System.Drawing.Drawing2D.GraphicsPath graphicsPathBorder = new System.Drawing.Drawing2D.GraphicsPath();
int d = this.Height;
graphicsPathBorder.AddArc(rectControl.X, rectControl.Y, d, d, 180, 90);
graphicsPathBorder.AddArc(rectControl.X + rectControl.Width - d, rectControl.Y, d, d, 270, 90);
graphicsPathBorder.AddArc(rectControl.X + rectControl.Width - d, rectControl.Y + rectControl.Height - d, d, d, 0, 90);
graphicsPathBorder.AddArc(rectControl.X, rectControl.Y + rectControl.Height - d, d, d, 90, 90);
this.Region = new Region(graphicsPathBorder);
#region inner Rounded Rectangle
System.Drawing.Drawing2D.GraphicsPath graphicsPathActiveMirror = new System.Drawing.Drawing2D.GraphicsPath();
d = this.Height / 2;
graphicsPathActiveMirror.AddArc(rectActiveMirroring.X, rectActiveMirroring.Y, d, d, 180, 90);
graphicsPathActiveMirror.AddArc(rectActiveMirroring.X + rectActiveMirroring.Width - d, rectActiveMirroring.Y, d, d, 270, 90);
graphicsPathActiveMirror.AddArc(rectActiveMirroring.X + rectActiveMirroring.Width - d, rectActiveMirroring.Y + rectActiveMirroring.Height - d, d, d, 0, 90);
graphicsPathActiveMirror.AddArc(rectActiveMirroring.X, rectActiveMirroring.Y + rectActiveMirroring.Height - d, d, d, 90, 90);
Rectangle rectInactiveMirroring = new Rectangle((rectToggleButton.X + rectToggleButton.Width / 2), this.Height / 2, (((this.Width / 2) + (this.Width / 4)) - (rectToggleButton.X + rectToggleButton.Width / 2)) + this.Height / 2, this.Height / 2); //4 * (this.Width / 6) + 20
System.Drawing.Drawing2D.GraphicsPath graphicsPathInactiveMirror = new System.Drawing.Drawing2D.GraphicsPath();
graphicsPathInactiveMirror.AddArc(rectInactiveMirroring.X, rectInactiveMirroring.Y, d, d, 180, 90);
graphicsPathInactiveMirror.AddArc(rectInactiveMirroring.X + rectInactiveMirroring.Width - d, rectInactiveMirroring.Y, d, d, 270, 90);
graphicsPathInactiveMirror.AddArc(rectInactiveMirroring.X + rectInactiveMirroring.Width - d, rectInactiveMirroring.Y + rectInactiveMirroring.Height - d, d, d, 0, 90);
graphicsPathInactiveMirror.AddArc(rectInactiveMirroring.X, rectInactiveMirroring.Y + rectInactiveMirroring.Height - d, d, d, 90, 90);
#endregion
if (ipadx < contentRectangle.Width / 2)
iosSelected = false;
else if (ipadx == contentRectangle.Right - (contentRectangle.Height - 3) || ipadx > contentRectangle.Width / 2)
iosSelected = true;
Rectangle ar1 = new Rectangle(rectControl.X, rectControl.Y, rectControl.X + rectToggleButton.Right, rectControl.Height);
Rectangle ar2 = new Rectangle(rectToggleButton.X + rectToggleButton.Width / 2, rectControl.Y, (rectToggleButton.X + rectToggleButton.Width / 2) + rectControl.Right, rectControl.Height);
LinearGradientBrush BrushActiveMirrorEffekt;
LinearGradientBrush activeToggleBrush;
LinearGradientBrush BrushInactiveMirrorEffekt;
LinearGradientBrush inactiveToggleBrush;
BrushActiveMirrorEffekt = new LinearGradientBrush(ar1, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical);
activeToggleBrush = new LinearGradientBrush(ar1, Color.Red, Color.Maroon, LinearGradientMode.Vertical);
BrushInactiveMirrorEffekt = new LinearGradientBrush(ar2, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical);
inactiveToggleBrush = new LinearGradientBrush(ar2, Color.Gray, Color.DarkGray, LinearGradientMode.Vertical);
e.Graphics.FillRectangle(activeToggleBrush, ar1);
e.Graphics.FillPath(BrushActiveMirrorEffekt, graphicsPathActiveMirror);
e.Graphics.FillRectangle(inactiveToggleBrush, ar2);
e.Graphics.FillPath(BrushInactiveMirrorEffekt, graphicsPathInactiveMirror);
SizeF onSizeF = e.Graphics.MeasureString(activeText, Font, 0, StringFormat.GenericTypographic);
SizeF offSizeF = e.Graphics.MeasureString(inActiveText, Font, 0, StringFormat.GenericTypographic);
if (iosSelected)
e.Graphics.DrawString(activeText, Font, new SolidBrush(ForeColor), new PointF(((rectControl.Width - rectControl.Height) - onSizeF.Width) / 2, (rectControl.Height - Font.Height) / 2));
else
e.Graphics.DrawString(inActiveText, Font, new SolidBrush(ForeColor), new PointF((((rectControl.Width - rectControl.Height) - offSizeF.Width) / 2 + rectControl.Height), (rectControl.Height - Font.Height) / 2));
#region Center Ellipse
Color c = this.Parent != null ? this.Parent.BackColor : Color.White;
e.Graphics.DrawEllipse(new Pen(Color.LightGray, 2f), rectToggleButton);
LinearGradientBrush br2 = new LinearGradientBrush(rectToggleButton, Color.White, Color.Silver, LinearGradientMode.Vertical);
e.Graphics.FillEllipse(br2, rectToggleButton);
#endregion
e.Graphics.DrawPath(new Pen(c, 2f), graphicsPathBorder);
e.Graphics.ResetClip();
}
#region Event Handlers
bool iosSelected = false;
bool dblclick = false;
public event ToggleButtonStateChanged ButtonStateChanged;
protected void RaiseButtonStateChanged()
{
if (this.ButtonStateChanged != null)
ButtonStateChanged(this, new ToggleButtonStateEventArgs(this.ToggleState));
}
public delegate void ToggleButtonStateChanged(object sender, ToggleButtonStateEventArgs e);
public class ToggleButtonStateEventArgs : EventArgs
{
public ToggleButtonStateEventArgs(ToggleButtonState ButtonState)
{
}
}
bool isMouseDown = false;
Point downpos = Point.Empty;
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (!this.DesignMode)
{
isMouseDown = true;
downpos = e.Location;
}
this.Invalidate();
}
bool isMouseMoved = false;
Point sliderPoint = Point.Empty;
int padx = 0; int ipadx = 2;
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left && !this.DesignMode)
{
sliderPoint = e.Location;
isMouseMoved = true;
ipadx = e.X;
if (ipadx <= 2)
{
ipadx = 2;
this.ToggleState = ToggleButtonState.OFF;
}
if (ipadx >= contentRectangle.Right - (contentRectangle.Height - 3))
{
ipadx = contentRectangle.Right - (contentRectangle.Height - 3);
this.ToggleState = ToggleButtonState.ON;
}
Refresh();
}
}
bool switchrec = false;
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if (!this.DesignMode)
{
this.Invalidate();
if (isMouseMoved)
{
ipadx = e.Location.X;
if (ipadx < contentRectangle.Width / 2)
{
ipadx = 2;
this.ToggleState = ToggleButtonState.OFF;
}
else
{
ipadx = contentRectangle.Right - (contentRectangle.Height - 3);
this.ToggleState = ToggleButtonState.ON;
}
Invalidate();
Update();
}
isMouseMoved = false;
isMouseDown = false;
}
}
#endregion
#region properties
private ToggleButtonState toggleState = ToggleButtonState.OFF;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public ToggleButtonState ToggleState
{
get
{
return toggleState;
}
set
{
if (toggleState != value)
{
RaiseButtonStateChanged();
toggleState = value;
Invalidate();
this.Refresh();
}
}
}
public enum ToggleButtonState
{
ON,
OFF
}
#endregion
}
}
Danke Abt,
zumindest in der Experimentellen Instanz hat das geholfen.
Dann kann ich mich ja an das nächste Problem machen 😁
Hallo liebe Community,
leider habe ich mir mein Projekt (vermutlich) zerschossen nach dem ich ein Control geändert hatte.
Meine Vorgehensweise:Control in einem VSIX Projekt erstellt
Control in Visual Studio 2017 installiert
Projekt geöffnet und Control erfolgreich benutzt
Wegen eines Designmangels an dem Control hab ich Änderungen vorgenommen und:Versionsnummer im Manifest des VSIX Projekts geändert und Projekt neu erstellt
Nun hab ich einfach das Control neu installiert und Visual Studio hat auch angezeigt das es eine Änderung ist
Mein Projekt erneut geöffnet
Und nun traten Fehler auf. Zum einen wollte das bereits eingefügte Control nicht mehr funktionieren.
In der Toolbox tauchte das Steuerelement nun 2x auf.
Und wenn ich versuchte das Control in den Designer zu ziehen gab es die Fehlermeldung> Fehlermeldung:
"Fehler beim erstellen der Komponente NameMeinesControls" . Ich glaube es gab ein hinweis darauf das der Pfad des Controls bereits existiert.
In andere Projekte ließ sich das Control allerdings verwenden.
Ich habe mein Projekt jetzt mühselig neu erstellt und würde gern ein neues Desaster bei einer erneuten Änderung vermeiden.
Muss ich das Control vor der erneuten Installation deinstallieren? ich kann es mir nicht vorstellen.
Auch kann ich mir nicht vorstellen das ich das Element vorher aus dem Designer wieder entfernen muss.
Gibt es etwas anderes das ich beachten muss?
Falls genauere Fehlermeldungen benötigt werden werde ich versuchen den Fehler zu reproduzieren.
Edit:
Hier nochmal zu den Fehlermeldungen
Nach dem öffnen des Projektes in dem das Control schon verwendet wurde Funktioniert der designer nicht. Ein Blick in die Designer Datei verrät: "Der Typ- oder Namespacename "MeinNamespace" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). ExperimentalProject C:\Users\Ich\Documents\Visual Studio 2017\Projects\ExperimentalProject\ExperimentalProject\Form1.Designer.cs"
Nach dem Entfernen des Controls aus der Designer Datei Funktioniert der Designer erstmal wieder.
Allerdings gibt es folgenden Fehler (siehe Anhang) bei dem Versuch das Element wieder neu anzulegen.
Vielen Dank Sir Rufo
Ja ich denke das es daran liegt, das BorderStyle.None das Default Value zu sein scheint - Zumindest für den Designer - Denn auf MSDN steht zum UserControl.BorderStyle das es Fixed3D ist 🤔
Hi Leute,
Ich habe ein Control erstellt bei welchem als BorderStyle FixedSingle gesetzt ist.
Zieh ich nun das Control aus der Toolbox in eine Form und setze den BorderStyle auf None hat dies keine Auswirkung.
Ist ja auch logisch, da das None nicht in die InitializeComponent der Form geschrieben wird.
Ist es irgendwie möglich das dies doch passiert?