Hello,
I just created a docker in visual studio.
I have attached something with Page.Properties that displays in docker.
but how can i refresh docker when user change page in coreldraw.
I have find document.pagechange or pageactivate event but don't know how to use.
please guide me.
I'm impressed... A lot of useful things for somebody not so skilled in C# like me. I am trying a way which looked easier to me. I'm trying to avoid lambda expressions and in this way unsubscribing should work. At least this is what I hope and test. I saved your generic class in a safe place and if what I am trying doesn't work I definitely will use it . Thank you again!
My thought looked to work...
Eliminating lambda expressions all event handlers were not anonymous any more and they could be found and events unsubscribed. Here's the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
public partial class DockerUI : UserControl { private corel.Application corelApp; public DockerUI(corel.Application app) { this.corelApp = app; InitializeComponent(); foreach (corel.Document doc in this.corelApp.Documents) { RegistryPageEvent(doc); } this.corelApp.DocumentOpen += RegistryPageEventOpen; this.corelApp.DocumentNew += RegistryPageEventNew; this.Unloaded += app_DockerUnloaded; } void RegistryPageEventOpen(corel.Document doc, string FileName) { doc.PageActivate += app_PageActivated; } void RegistryPageEventNew(corel.Document doc, bool fT,string t, bool inclG) { doc.PageActivate += app_PageActivated; } //pageActivated event... void app_PageActivated(corel.Page pag) { MessageBox.Show(pag.Name, "Docker_Event"); } void RegistryPageEvent(corel.Document doc) { doc.PageActivate += app_PageActivated; } void UnRegistryPageEvent(corel.Document doc) { doc.PageActivate -= app_PageActivated; } void app_DockerUnloaded(object sender, RoutedEventArgs e) { corelApp.DocumentOpen -= RegistryPageEventOpen; corelApp.DocumentNew -= RegistryPageEventNew; foreach (corel.Document doc in this.corelApp.Documents) { UnRegistryPageEvent(doc); } MessageBox.Show("Terminated..."); } private void btHello_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Hello from my docker!", "Greetings..."); } }
Finally I succeed to use hilite.me...
Thanks for that, too!
Just a quick reference CorelDRAW has several events that can be listened to. You can find a list in this article:
Custom Dockers in CorelDRAW, Corel DESIGNER and Corel PHOTO-PAINT
-Shelby
I'm trying to fill some docker text boxes with document Width and Height followed by unit of measure but instead of the real document unit of measure it always shows millimeters. And it also transforms in millimeters the real units of measure. Only first time on WindowActivate runs for a new document it shows inches (dimensions and measuring units).
In VBA code is happening exactly the same thing. In X8 I mean. In X6 it returns the real dimensions and measuring units...
Is it something which I do wrong and I'm missing it?
Here is the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
void UpdateDockerFields(corel.Document doc, corel.Window window) { this.txtName.Text = this.corelApp.ActiveDocument.Name; this.txtPagHeight.Text = this.corelApp.ActivePage.SizeHeight.ToString(); this.txtPagWidth.Text = this.corelApp.ActivePage.SizeWidth.ToString(); this.txtMU.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); } private string UM(string um) { switch(um) { case "cdrInch": return "Inch"; case "cdrMillimeter": return"mm"; case "cdrCentimeter": return"cm"; case "cdrPixel": return"pixel"; case "cdrMeter": return"m"; default: return"strange..."; } }
I found a kind of workaround but strange on my taste...
I initially make the Unit = Rullers.HUnits and strangely it looks Working. Even if ruler unit is changed by changing the Unit 'Drawing units' combo.
The so updated code:
1 2 3 4 5 6 7 8 9 10
void UpdateDockerFields() { this.txtName.Text = this.corelApp.ActiveDocument.Name; this.txtPagHeight.Text = this.corelApp.ActivePage.SizeHeight.ToString(); this.txtPagWidth.Text = this.corelApp.ActivePage.SizeWidth.ToString(); this.corelApp.ActiveDocument.Unit = this.corelApp.ActiveDocument.Rulers.HUnits; this.txtMU.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); this.txtMU_.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); }
I' m a little disappointed...
When docker remained activated in corel it is loaded before the first new document and my intention to fill some text boxes with identification parameters (name, page width, page height, measuring unit, etc) does not have (yet) the object and without receiving an error, the docker appearance misses all controls. I finally understood that and adapted the code for this situation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
public partial class DockerUI : UserControl { private corel.Application corelApp; private int i = 0; bool noDocument = false; public DockerUI(corel.Application app) { this.corelApp = app; InitializeComponent(); if (corelApp.Documents.Count < 1) { this.txtTest.Text = "No document..."; noDocument = true; } else { foreach (corel.Document doc in this.corelApp.Documents) { i = ++i; this.txtTest.Text = "Try init - " + doc.Name + " - " + i; doc.PageChange += UpdateDockerFieldsPagChg; } UpdateDockerFields(); } this.Unloaded += UnsubscribeEvents; } void UnsubscribeEvents(object sender, RoutedEventArgs e) { if (noDocument==false) { foreach (corel.Document doc in this.corelApp.Documents) { doc.PageChange -= UpdateDockerFieldsPagChg; } } else {MessageBox.Show( noDocument.ToString()); } }
I tried to programmatically wait for some seconds but it looks that the document is waiting the docker loading as long it takes... I consider now the help of VBA and refresh the docker when documentNew event will occur.
Can somebody help me to set debugger to stop on the line having errors? For I don't know what reason it doesn't do that on the docker load event...
But I am disappointed because of something else...
After solving this situation of 'no any document' opened in corel, it works well but only for some times. For instance if I have three opened documents and activating the docker everything works as expected for for about six to twenty times and page change event is lost...
I do not know if or how to upload here the project. I do not see any such an option. So, I will post the code, maybe somebody will be patient enough to try it...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
public partial class DockerUI : UserControl { private corel.Application corelApp; private int i = 0; bool noDocument = false; public DockerUI(corel.Application app) { this.corelApp = app; InitializeComponent(); if (corelApp.Documents.Count < 1) { this.txtTest.Text = "No document..."; noDocument = true; } else { foreach (corel.Document doc in this.corelApp.Documents) { i = ++i; this.txtTest.Text = "Try init - " + doc.Name + " - " + i; doc.PageChange += UpdateDockerFieldsPagChg; } UpdateDockerFields(); } this.Unloaded += UnsubscribeEvents; } void UpdateDockerFieldsPagChg(corel.Page page) { UpdateDockerFields(); this.txtTest.Text = "OK pageChange... - "+corelApp.ActiveDocument.Name + " - " + page.Name; //MessageBox.Show(page.Name); } void UpdateDockerFields() { this.corelApp.ActiveDocument.Unit = this.corelApp.ActiveDocument.Rulers.HUnits; this.txtName.Text = this.corelApp.ActiveDocument.Name; this.txtPagHeight.Text = this.corelApp.ActivePage.SizeHeight.ToString(); this.txtPagWidth.Text = this.corelApp.ActivePage.SizeWidth.ToString(); this.txtMU.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); this.txtMU_.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); } private string UM(string um) { switch (um) { case "cdrInch": return "Inch"; case "cdrMillimeter": return "mm"; case "cdrCentimeter": return "cm"; case "cdrPixel": return "pixel"; case "cdrMeter": return "m"; default: return "strange..."; } } void UnsubscribeEvents(object sender, RoutedEventArgs e) { if (noDocument==false) { //this.corelApp.WindowActivate -= UpdateDockerFieldsWinAct; // this.corelApp.DocumentNew -= UpdateDockerFieldsDocNew; foreach (corel.Document doc in this.corelApp.Documents) { doc.PageChange -= UpdateDockerFieldsPagChg; } } else {MessageBox.Show( noDocument.ToString()); } } private void btShowForm_Click(object sender, RoutedEventArgs e) { //frmCorel frmC = new frmCorel(corelApp); //frmC.ShowDialog(); } }
And Xaml part of the main Grid:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<Grid Margin="0,0,0,0"> <StackPanel> <Label Content="Active Document Name" HorizontalAlignment="Center" Margin="5,5,0,5" /> <TextBox Name="txtName" HorizontalAlignment="Center" Margin="5,5,0,5" /> <DockPanel> <Label DockPanel.Dock="Left" Content="Page Width: " Width="80"/> <TextBox DockPanel.Dock="Left" Name="txtPagWidth" Width="40" Margin="5,0,50,0"/> <TextBox DockPanel.Dock="Left" Name="txtMU" Width="40" Margin="5,0,10,0"/> </DockPanel> <DockPanel> <Label DockPanel.Dock="Left" Content="Page Height:" Width="80"/> <TextBox DockPanel.Dock="Left" Name="txtPagHeight" Width="40" Margin="5,0,50,0"/> <TextBox DockPanel.Dock="Left" Name="txtMU_" Margin="5,0,10,0" Width="40"/> </DockPanel> <Button Name="btShowForm" Content="Show Form" Width="70" Click="btShowForm_Click" Margin="10"/> <TextBox Name="txtTest" /> </StackPanel> </Grid>
Do you face the same problem? If yes, any idea to make it work?
Is it possible to catch the handler of event to be subscribed check it from time to time...? In this way I will also avoid unsubscribing on docker unload event if I will check the handler before subscription.